Creating conditional Value Lists for many to many relationship in filemaker - relationship

I am creating an app for student management. My database has three tables that manage student classes; Class and Stream. These two tables have a many to many relationship so I created a third table Class Stream to join them by using their IDs.
Currently, creating conditional value lists works fine for a one to many relationship where only two tables are involved.
Now I need to create conditional value lists with three tables (Class, Stream, & Class Stream) involved whereby if I select a given class, only stream values belonging to that specific class display in form of a drop down list in the field below.
My value lists filter has two dropdown lists. The first one displays class names and the second one displays stream names. I need to make sure that when I select a class, the dropdown list for stream names contains only streams that belong to the selected class above.

For create a conditional value lists, you should use a separate occurrences from original table occurrence and create a relation like this:
Database Relations
and use a simple value list for Class names like this:
Value list for class names
and a related value list for stream names like this:
Value list for stream names

Related

Best approach to model multiple children table database

What I have: A Postgres database with TypeORM.
What is the model: A main entity Event and many children inherited (10+). Each children will have attributes very different from each other. Each Event belong to an User, left out of the example as it is not important for this particular case. For a simplified example, I've attached a mock diagram.
How do I use it: The model will be queried for the list of all aggregated events, in chronological order, and then filtered by its "type" in order to be displayed (Parameter, Symptom, ...). This means that I want a list with a subset of the most recent 20 Events (as example). For each of those 20 I will get each individual data from the table (or embed it in the first place).
Some of the events will happen with an high frequency while others with a much lower frequency.
The question is, what would be the best approach to model this?
I came up with:
Single table, Event contains everything
Cons: it will contains a lot of NULLs
Pros: everything can be aggregated through that table, no joins or views needed
Multiple tables, one for each type
Cons: I will need to have lots of joins and views to aggregate the data
Pros: Each table and entry is meaningful of its data and type
Multiple tables plus a main Event which points to the types row
Cons: Almost same as above but with an easier way to get certain aggregation per User
Pros: Same as above
It looks like you have a straight-forward tree structure rooted at the User entity. Something like this:
You then just need a table for each entity:
Users
Events
The Children (Parameter, Symptom, etc.)
The Events have a user field, that contains the ID of their parent User. Similarly, the Children have an event field that contains the ID of their parent Event.
Such that:
"Child" {
event -> id of parent Event
}
Event {
user -> id of parent User
}
In TS, you can create Entities for each type of Child (Symptom, Meal, etc.) so they remain strictly-typed. Having a seperate table for each allows you to optimize their DB representations however you want (indexing specific fields, normalizing, etc.). Seperate tables also allows you to avoid having a lot of NULLs for uncommon values.

Tableau- Filtering based on another element

I have multiple tables with one common element (ID). The first table has is the only one that has the ID and First Name. In a dashboard, I am trying to create a filter where when I type in or select the First Name, all data from all tables relating to the First Name's ID would populate.
FYI, I don't want to join the data. My actual tables are big data from multiple sources I would like to find an alternative route to this.
I also tried to create a parameter for the First Name and then created a Calculated Field with
IF [Parameter]=[Name]
THEN [ID]
ELSE NULL
END
but this didn't work. I am very new to Tableau and I'm thinking that there must be a way where the choosing a Name would trigger the ID and its relevant data.
create multiple sheets with different tables where each sheet will be collected to individual table.
Now create a filter and apply the filter to all worksheets and then go to dashboard and apply filter, Dash board should change.

the correct structure relation between student vs teacher comparing to user table

What is the correct database structure design for user table if I have instructor vs student?
Is it correct to create each one in separate table and the id is the user table
Like this?:
Or creating new flag field (1 or 2) to define the students from the instructors like this?:
I know both will work, but I'm asking to get the most professional answer for this problem.
For me i'm working on Laravel and creating a relations there is very easy.
The first option - separate tables for each subtype of user - is recommended when you have subtype-specific attributes, relationships or constraints; and a known fixed set of subtypes.
The second option - a type indicator column - is recommended when you don't have any subtype-specific attributes, relationships or constraints; and works better for user-managed subtypes.
It doesn't matter whether you have overlapping or disjoint subtypes. Either can be recorded in separate tables; or overlapping subtypes can be indicated via multiple boolean fields and disjoint via a single field.

How to give categories to array data in a class, which would be displayed in various table view according to categories?

I am new to the programming field. I want to make an app, which should categorize array data within a class and display them in various table view as per the tab bar.
For example: I want to prepare a swift training courses in table view via tab bar.
Categories: Popular, Level, duration, etc.
How should I create a data array and categorize them in a class? So whenever I call that array in various table views, I can filter them and dont need to re-type the same data on various array as per the categories.
A Dictionary will be better alternative than an Array. Set the different categories as the keys in the dictionary. And the values can be stored in an array.
let theDictionary = [
"Popular":["Item 1","Item 2","Item 3"],
"Level":["Basic","Intermeidate","....."],
"Duration":["Short","Long"]]
To populate this in a table view, you will extract each of the key value paris. The Rows of the table will the contents of the Array object.

How do you manage "pick lists" in a database

I have an application with multiple "pick list" entities, such as used to populate choices of dropdown selection boxes. These entities need to be stored in the database. How do one persist these entities in the database?
Should I create a new table for each pick list? Is there a better solution?
In the past I've created a table that has the Name of the list and the acceptable values, then queried it to display the list. I also include a underlying value, so you can return a display value for the list, and a bound value that may be much uglier (a small int for normalized data, for instance)
CREATE TABLE PickList(
ListName varchar(15),
Value varchar(15),
Display varchar(15),
Primary Key (ListName, Display)
)
You could also add a sortOrder field if you want to manually define the order to display them in.
It depends on various things:
if they are immutable and non relational (think "names of US States") an argument could be made that they should not be in the database at all: after all they are simply formatting of something simpler (like the two character code assigned). This has the added advantage that you don't need a round trip to the db to fetch something that never changes in order to populate the combo box.
You can then use an Enum in code and a constraint in the DB. In case of localized display, so you need a different formatting for each culture, then you can use XML files or other resources to store the literals.
if they are relational (think "states - capitals") I am not very convinced either way... but lately I've been using XML files, database constraints and javascript to populate. It works quite well and it's easy on the DB.
if they are not read-only but rarely change (i.e. typically cannot be changed by the end user but only by some editor or daily batch), then I would still consider the opportunity of not storing them in the DB... it would depend on the particular case.
in other cases, storing in the DB is the way (think of the tags of StackOverflow... they are "lookup" but can also be changed by the end user) -- possibly with some caching if needed. It requires some careful locking, but it would work well enough.
Well, you could do something like this:
PickListContent
IdList IdPick Text
1 1 Apples
1 2 Oranges
1 3 Pears
2 1 Dogs
2 2 Cats
and optionally..
PickList
Id Description
1 Fruit
2 Pets
I've found that creating individual tables is the best idea.
I've been down the road of trying to create one master table of all pick lists and then filtering out based on type. While it works, it has invariably created headaches down the line. For example you may find that something you presumed to be a simple pick list is not so simple and requires an extra field, do you now split this data into an additional table or extend you master list?
From a database perspective, having individual tables makes it much easier to manage your relational integrity and it makes it easier to interpret the data in the database when you're not using the application
We have followed the pattern of a new table for each pick list. For example:
Table FRUIT has columns ID, NAME, and DESCRIPTION.
Values might include:
15000, Apple, Red fruit
15001, Banana, yellow and yummy
...
If you have a need to reference FRUIT in another table, you would call the column FRUIT_ID and reference the ID value of the row in the FRUIT table.
Create one table for lists and one table for list_options.
# Put in the name of the list
insert into lists (id, name) values (1, "Country in North America");
# Put in the values of the list
insert into list_options (id, list_id, value_text) values
(1, 1, "Canada"),
(2, 1, "United States of America"),
(3, 1, "Mexico");
To answer the second question first: yes, I would create a separate table for each pick list in most cases. Especially if they are for completely different types of values (e.g. states and cities). The general table format I use is as follows:
id - identity or UUID field (I actually call the field xxx_id where xxx is the name of the table).
name - display name of the item
display_order - small int of order to display. Default this value to something greater than 1
If you want you could add a separate 'value' field but I just usually use the id field as the select box value.
I generally use a select that orders first by display order, then by name, so you can order something alphabetically while still adding your own exceptions. For example, let's say you have a list of countries that you want in alpha order but have the US first and Canada second you could say "SELECT id, name FROM theTable ORDER BY display_order, name" and set the display_order value for the US as 1, Canada as 2 and all other countries as 9.
You can get fancier, such as having an 'active' flag so you can activate or deactivate options, or setting a 'x_type' field so you can group options, description column for use in tooltips, etc. But the basic table works well for most circumstances.
Two tables. If you try to cram everything into one table then you break normalization (if you care about that). Here are examples:
LIST
---------------
LIST_ID (PK)
NAME
DESCR
LIST_OPTION
----------------------------
LIST_OPTION_ID (PK)
LIST_ID (FK)
OPTION_NAME
OPTION_VALUE
MANUAL_SORT
The list table simply describes a pick list. The list_ option table describes each option in a given list. So your queries will always start with knowing which pick list you'd like to populate (either by name or ID) which you join to the list_ option table to pull all the options. The manual_sort column is there just in case you want to enforce a particular order other than by name or value. (BTW, whenever I try to post the words "list" and "option" connected with an underscore, the preview window goes a little wacky. That's why I put a space there.)
The query would look something like:
select
b.option_name,
b.option_value
from
list a,
list_option b
where
a.name="States"
and
a.list_id = b.list_id
order by
b.manual_sort asc
You'll also want to create an index on list.name if you think you'll ever use it in a where clause. The pk and fk columns will typically automatically be indexed.
And please don't create a new table for each pick list unless you're putting in "relationally relevant" data that will be used elsewhere by the app. You'd be circumventing exactly the relational functionality that a database provides. You'd be better off statically defining pick lists as constants somewhere in a base class or a properties file (your choice on how to model the name-value pair).
Depending on your needs, you can just have an options table that has a list identifier and a list value as the primary key.
select optionDesc from Options where 'MyList' = optionList
You can then extend it with an order column, etc. If you have an ID field, that is how you can reference your answers back... of if it is often changing, you can just copy the answer value to the answer table.
If you don't mind using strings for the actual values, you can simply give each list a different list_id in value and populate a single table with :
item_id: int
list_id: int
text: varchar(50)
Seems easiest unless you need multiple things per list item
We actually created entities to handle simple pick lists. We created a Lookup table, that holds all the available pick lists, and a LookupValue table that contains all the name/value records for the Lookup.
Works great for us when we need it to be simple.
I've done this in two different ways:
1) unique tables per list
2) a master table for the list, with views to give specific ones
I tend to prefer the initial option as it makes updating lists easier (at least in my opinion).
Try turning the question around. Why do you need to pull it from the database? Isn't the data part of your model but you really want to persist it in the database? You could use an OR mapper like linq2sql or nhibernate (assuming you're in the .net world) or depending on the data you could store it manually in a table each - there are situations where it would make good sense to put it all in the same table but do consider this only if you feel it makes really good sense. Normally putting different data in different tables makes it a lot easier to (later) understand what is going on.
There are several approaches here.
1) Create one table per pick list. Each of the tables would have the ID and Name columns; the value that was picked by the user would be stored based on the ID of the item that was selected.
2) Create a single table with all pick lists. Columns: ID; list ID (or list type); Name. When you need to populate a list, do a query "select all items where list ID = ...". Advantage of this approach: really easy to add pick lists; disadvantage: a little more difficult to write group-by style queries (for example, give me the number of records that picked value X".
I personally prefer option 1, it seems "cleaner" to me.
You can use either a separate table for each (my preferred), or a common picklist table that has a type column you can use to filter on from your application. I'm not sure that one has a great benefit over the other generally speaking.
If you have more than 25 or so, organizationally it might be easier to use the single table solution so you don't have several picklist tables cluttering up your database.
Performance might be a hair better using separate tables for each if your lists are very long, but this is probably negligible provided your indexes and such are set up properly.
I like using separate tables so that if something changes in a picklist - it needs and additional attribute for instance - you can change just that picklist table with little effect on the rest of your schema. In the single table solution, you will either have to denormalize your picklist data, pull that picklist out into a separate table, etc. Constraints are also easier to enforce in the separate table solution.
This has served us well:
SQL> desc aux_values;
Name Type
----------------------------------------- ------------
VARIABLE_ID VARCHAR2(20)
VALUE_SEQ NUMBER
DESCRIPTION VARCHAR2(80)
INTEGER_VALUE NUMBER
CHAR_VALUE VARCHAR2(40)
FLOAT_VALUE FLOAT(126)
ACTIVE_FLAG VARCHAR2(1)
The "Variable ID" indicates the kind of data, like "Customer Status" or "Defect Code" or whatever you need. Then you have several entries, each one with the appropriate data type column filled in. So for a status, you'd have several entries with the "CHAR_VALUE" filled in.

Resources