|
Question : Relational Database Cardinality (How is it expressed)
|
|
Greetings,
I am trying to understand how cardinality is expressed in a relational database schema as opposed to a schema which is object oriented.
For instance, when creating a few tables(relational) for a bus company where the corprate office table has a relation with branch offices table, how can the one to many relation be expressed? Here are the two tables:
create table XYZ_Bus_Company --Corp. Office ( Branch_Name varchar(20)not null, Employee_SSN char(9)not null, primary key(Branch_Name, Employee_SSN), foreign key(Branch_Name) references(Branch_Offices), foreign key(Employee_SSN) references(Employee) );
create table Branch_Offices ( Branch_Name varchar(20), Address varchar(30),
The XYZ Bus Co. has many branches but the Branch Office table has only one corprate office. With the attributes I have above, how does the Branch_Offices table relate to the corprate office?
In other words, what field/attribute do I need to add to complete the relation? I want to add the following line to the Branch_Offices table but I don't know if it would be the best way because the field would be somewhat redundant in each tuple:
Corp_Office char(11), --XYZ Company
Thanks
John
|
|
Answer : Relational Database Cardinality (How is it expressed)
|
|
Hi John,
let's see if I can make it clear to you...
1 - Your 2 tables...
I think you want to have a "XYZ_Company" that has many "Branch_Offices", and one of them is the "Corporate_Office" (like a main office).
If it is like that, you must have 2 tables (you already have them). You want a relationship between them: "Company" - 1:m - "Branch_Office". How do you represent it on the tables?
From the Company side you would have to link it to a variable number of branches; can't do it with an attribute (column). But from the Branch_Office side you have to link it to 1 Company. That can be done by putting the "Company" key/id attribute in the Branch_Office table, making it a foreign key to the "Company" table. You solved your problem! A "Branch_Office" points to a "Company".
How can you get all the offices of the company? You search the "Branch_Office" table for every row that "points" to the "Company" you want!
Now, let's go to the point where a "Company has one corporate office": you want a relationship "Company" - 1:1 - "Branch_Office". For this, you put the "Branch_Office" key/id attribute (koreign key to Branch_Office) in the "Company" table. Like this, any Company you insert points to a Branch_Office (the corporate office). You could also put the relationship attribute in the other side, but why would you do this when most of the Branch_Offices are not main offices, and would have the relationship attribute filled with NULL value?
As you might see, this 2 kinds of relationship are represented with an attribute. You can only figure out what kind of relationship it is, by knowing/looking the conceptual model.
Hope this helps,
PMT
|
|
|
|