The Relational Model
by K. Yue
1. Introduction
Example:
CREATE TABLE IF NOT EXISTS Class (
classId INT NOT NULL AUTO_INCREMENT,
courseId INT NOT NULL,
semester VARCHAR(10) NOT NULL,
year DECIMAL(4,0) NOT NULL,
facId INT NOT NULL,
room VARCHAR(6),
CONSTRAINT Class_classId_pk PRIMARY KEY (classId),
CONSTRAINT Class_courseId_fk FOREIGN KEY (courseId)
REFERENCES Course(courseId) ON DELETE CASCADE,
CONSTRAINT Class_facId_fk FOREIGN KEY (facId)
REFERENCES Faculty (facId) ON DELETE CASCADE
);
INSERT INTO Class VALUES
(10000,2000,'Fall',2019,1011,'D241'),
(10001,2001,'Fall',2019,1011,'D242'),
(10002,2002,'Fall',2019,1012,'D136'),
(10003,2020,'Fall',2019,1014,'D241'),
(10004,2021,'Fall',2019,1014,'D241'),
(10005,2040,'Fall',2019,1015,'D237'),
(10006,2041,'Fall',2019,1019,'D217'),
(10007,2060,'Fall',2019,1020,'B101'),
(10008,2080,'Fall',2019,1018,'D241'),
(11000,2000,'Spring',2020,1011,'D241'),
(11001,2001,'Spring',2020,1013,'D242'),
(11002,2002,'Spring',2020,1013,'D136'),
(11003,2020,'Spring',2020,1016,'D217'),
(11004,2061,'Spring',2020,1018,'B101');
mysql> SELECT * FROM class;
+---------+----------+----------+------+-------+------+
| classId | courseId | semester | year | facId | room |
+---------+----------+----------+------+-------+------+
| 10000 | 2000 | Fall | 2019 | 1011 | D241 |
| 10001 | 2001 | Fall | 2019 | 1011 | D242 |
| 10002 | 2002 | Fall | 2019 | 1012 | D136 |
| 10003 | 2020 | Fall | 2019 | 1014 | D241 |
| 10004 | 2021 | Fall | 2019 | 1014 | D241 |
| 10005 | 2040 | Fall | 2019 | 1015 | D237 |
| 10006 | 2041 | Fall | 2019 | 1019 | D217 |
| 10007 | 2060 | Fall | 2019 | 1020 | B101 |
| 10008 | 2080 | Fall | 2019 | 1018 | D241 |
| 11000 | 2000 | Spring | 2020 | 1011 | D241 |
| 11001 | 2001 | Spring | 2020 | 1013 | D242 |
| 11002 | 2002 | Spring | 2020 | 1013 | D136 |
| 11003 | 2020 | Spring | 2020 | 1016 | D217 |
| 11004 | 2061 | Spring | 2020 | 1018 | B101 |
+---------+----------+----------+------+-------+------+
{classId: 10004, courseId: 2021, semester: 'Fall', year: 2019, facId: 1014, room: 'D241'} is a tuple.
It can also be represented as:
{classId: 10004, facId: 1014, room: 'D241', semester: 'Fall', year: 2019, courseId: 2021}
or
{10004, 2021, 'Fall', 2019, 1014, 'D241'} if the attribute names are assumed.
or using a more computer science-style notation.
(10004, 2021, 'Fall', 2019, 1014, 'D241')
Identify some examples of the terms in the class table above as much as possible.
Example:
+---------+----------+----------+------+-------+------+
| classId | courseId | semester | year | facId | room |
+---------+----------+----------+------+-------+------+
| 10000 | 2000 | Fall | 2019 | 1011 | D241 |
| 10001 | 2001 | Fall | 2019 | 1011 | D242 |
| 10002 | 2002 | Fall | 2019 | 1012 | D136 |
| 10003 | 2020 | Fall | 2019 | 1014 | D241 |
| 10004 | 2021 | Fall | 2019 | 1014 | D241 |
| 10005 | 2040 | Fall | 2019 | 1015 | D237 |
| 10006 | 2041 | Fall | 2019 | 1019 | D217 |
| 10007 | 2060 | Fall | 2019 | 1020 | B101 |
| 10008 | 2080 | Fall | 2019 | 1018 | D241 |
| 11000 | 2000 | Spring | 2020 | 1011 | D241 |
| 11001 | 2001 | Spring | 2020 | 1013 | D242 |
| 11002 | 2002 | Spring | 2020 | 1013 | D136 |
| 11003 | 2020 | Spring | 2020 | 1016 | D217 |
| 11004 | 2061 | Spring | 2020 | 1018 | B101 |
+---------+----------+----------+------+-------+------+
and
+---------+------+----------+----------+------+-------+
| classId | year | semester | courseId | room | facId |
+---------+------+----------+----------+------+-------+
| 11004 | 2020 | Spring | 2061 | B101 | 1018 |
| 10007 | 2019 | Fall | 2060 | B101 | 1020 |
| 10002 | 2019 | Fall | 2002 | D136 | 1012 |
| 11002 | 2020 | Spring | 2002 | D136 | 1013 |
| 11003 | 2020 | Spring | 2020 | D217 | 1016 |
| 10006 | 2019 | Fall | 2041 | D217 | 1019 |
| 10005 | 2019 | Fall | 2040 | D237 | 1015 |
| 10000 | 2019 | Fall | 2000 | D241 | 1011 |
| 11000 | 2020 | Spring | 2000 | D241 | 1011 |
| 10003 | 2019 | Fall | 2020 | D241 | 1014 |
| 10004 | 2019 | Fall | 2021 | D241 | 1014 |
| 10008 | 2019 | Fall | 2080 | D241 | 1018 |
| 10001 | 2019 | Fall | 2001 | D242 | 1011 |
| 11001 | 2020 | Spring | 2001 | D242 | 1013 |
+---------+------+----------+----------+------+-------+
stores the same information.
The second talbe can be obtained by:
SELECT classId, year, semester, courseId, room, facId
FROM class
ORDER BY room, facId;
Null values:
Example:
Consider the attribute SpouseName. A Null value may mean:
How do we distinguish between the three meanings of the null value in this case?
By using an extra attribute, such as MaritalStatus.
2. Keys
Example:
Consider:
mysql> SELECT * FROM faculty;
+-------+----------+----------+----------+---------------------+
| facId | fname | lname | deptCode | rank |
+-------+----------+----------+----------+---------------------+
| 1011 | Paul | Smith | CSCI | Professor |
| 1012 | Mary | Tran | CSCI | Associate Professor |
| 1013 | David | Love | CSCI | |
| 1014 | Sharon | Mannes | CSCI | Assistant Professor |
| 1015 | Daniel | Kim | CINF | Professor |
| 1016 | Andrew | Byre | CINF | Associate Professor |
| 1017 | Deborah | Gump | ITEC | Professor |
| 1018 | Art | Allister | ARTS | Assistant Professor |
| 1019 | Benjamin | Yu | ITEC | Lecturer |
| 1020 | Katrina | Bajaj | ENGL | Lecturer |
| 1021 | Jorginlo | Neymar | ACCT | Assistant Professor |
+-------+----------+----------+----------+---------------------+
11 rows in set (0.00 sec)
mysql> SELECT * FROM department;
+----------+------------------------------+------------+------------+
| deptCode | deptName | schoolCode | numFaculty |
+----------+------------------------------+------------+------------+
| ACCT | Accounting | BUS | 10 |
| ARTS | Arts | HSH | 5 |
| CINF | Computer Information Systems | CSE | 5 |
| CSCI | Computer Science | CSE | 12 |
| ENGL | English | HSH | 12 |
| ITEC | Information Technology | CSE | 4 |
| MATH | Mathematics | CSE | 7 |
+----------+------------------------------+------------+------------+
7 rows in set (0.00 sec)
Consider also:
mysql> SELECT * FROM enroll;
+--------+---------+-------+----------+
| stuId | classId | grade | n_alerts |
+--------+---------+-------+----------+
| 100000 | 10000 | A | 0 |
| 100001 | 10000 | NULL | NULL |
| 100002 | 10000 | B- | 3 |
| 100000 | 10001 | A | 2 |
| 100001 | 10001 | A- | 0 |
| 100000 | 10002 | B+ | 1 |
| 100002 | 10002 | B+ | 2 |
| 100000 | 10003 | C | 0 |
| 100002 | 10003 | D | 4 |
| 100004 | 10003 | A | 0 |
| 100005 | 10003 | NULL | NULL |
| 100000 | 10004 | A- | 1 |
| 100004 | 10004 | B+ | NULL |
| 100005 | 10004 | A- | 0 |
| 100006 | 10004 | C+ | NULL |
| 100005 | 10005 | A- | 0 |
| 100006 | 10005 | A | NULL |
| 100005 | 10006 | B+ | NULL |
| 100007 | 10007 | F | 4 |
| 100008 | 10007 | C- | 0 |
| 100007 | 10008 | A- | 0 |
| 100000 | 11001 | D | 4 |
+--------+---------+-------+----------+
22 rows in set (0.00 sec)
Classroom Exercise:
(1) Give a realistic example of a relation with two candidate keys. State the assumptions you have made.
(2) A relation R has an arity of 4. What are the possible minimum and maximum number of superkeys of R? . What are the possible minimum and maximum number of candidate keys of R?
What about the general case?
More about keys:
Consider the example above. The attribute deptCode is a foreign key in the relation faculty, referencing department(deptCode)
Likewise, stuid is a foreign key in the relation Enroll: stuid references student(stuid)
Note that the student table has three foreign keys.
Example:
SELECT * FROM faculty;mysql> SELECT * FROM faculty;
+-------+----------+----------+----------+---------------------+
| facId | fname | lname | deptCode | rank |
+-------+----------+----------+----------+---------------------+
| 1011 | Paul | Smith | CSCI | Professor |
| 1012 | Mary | Tran | CSCI | Associate Professor |
| 1013 | David | Love | CSCI | NULL |
| 1014 | Sharon | Mannes | CSCI | Assistant Professor |
| 1015 | Daniel | Kim | CINF | Professor |
| 1016 | Andrew | Byre | CINF | Associate Professor |
| 1017 | Deborah | Gump | ITEC | Professor |
| 1018 | Art | Allister | ARTS | Assistant Professor |
| 1019 | Benjamin | Yu | ITEC | Lecturer |
| 1020 | Katrina | Bajaj | ENGL | Lecturer |
| 1021 | Jorginlo | Neymar | ACCT | Assistant Professor |
+-------+----------+----------+----------+---------------------+
11 rows in set (0.00 sec)
mysql> SELECT * FROM department;
+----------+------------------------------+------------+------------+
| deptCode | deptName | schoolCode | numFaculty |
+----------+------------------------------+------------+------------+
| ACCT | Accounting | BUS | 10 |
| ARTS | Arts | HSH | 5 |
| CINF | Computer Information Systems | CSE | 5 |
| CSCI | Computer Science | CSE | 12 |
| ENGL | English | HSH | 12 |
| ITEC | Information Technology | CSE | 4 |
| MATH | Mathematics | CSE | 7 |
+----------+------------------------------+------------+------------+
7 rows in set (0.00 sec)
mysql> SELECT s.fname, s.lname, s.advisor, f.`rank`
-> FROM student AS s INNER JOIN faculty AS f
-> ON (s.advisor = f.facId);
+-----------+---------+---------+---------------------+
| fname | lname | advisor | rank |
+-----------+---------+---------+---------------------+
| Tony | Hawk | 1011 | Professor |
| Mary | Hawk | 1011 | Professor |
| David | Hawk | 1011 | Professor |
| Catherine | Lim | 1017 | Professor |
| Larry | Johnson | 1017 | Professor |
| Linda | Johnson | 1015 | Professor |
| Lillian | Johnson | 1015 | Professor |
| Bill | Ching | 1018 | Assistant Professor |
| Linda | King | 1018 | Assistant Professor |
+-----------+---------+---------+---------------------+
SELECT * FROM student;
SELECT * FROM faculty;
SELECT s.fname, s.lname, s.advisor, f.`rank`
FROM student AS s INNER JOIN faculty AS f
ON (s.advisor = f.facId);
mysql> SELECT * FROM student;
+--------+-----------+---------+-------+-------+---------+---------+
| stuId | fname | lname | major | minor | credits | advisor |
+--------+-----------+---------+-------+-------+---------+---------+
| 100000 | Tony | Hawk | CSCI | CINF | 40 | 1011 |
| 100001 | Mary | Hawk | CSCI | CINF | 35 | 1011 |
| 100002 | David | Hawk | CSCI | ITEC | 66 | 1011 |
| 100003 | Catherine | Lim | ITEC | CINF | 20 | 1017 |
| 100004 | Larry | Johnson | ITEC | | 66 | 1017 |
| 100005 | Linda | Johnson | CINF | ENGL | 13 | 1015 |
| 100006 | Lillian | Johnson | CINF | ITEC | 18 | 1015 |
| 100007 | Ben | Zico | NULL | NULL | 16 | NULL |
| 100008 | Bill | Ching | ARTS | ENGL | 90 | 1018 |
| 100009 | Linda | King | ARTS | CSCI | 125 | 1018 |
+--------+-----------+---------+-------+-------+---------+---------+
10 rows in set (0.00 sec)
mysql> SELECT * FROM faculty;
+-------+----------+----------+----------+---------------------+
| facId | fname | lname | deptCode | rank |
+-------+----------+----------+----------+---------------------+
| 1011 | Paul | Smith | CSCI | Professor |
| 1012 | Mary | Tran | CSCI | Associate Professor |
| 1013 | David | Love | CSCI | |
| 1014 | Sharon | Mannes | CSCI | Assistant Professor |
| 1015 | Daniel | Kim | CINF | Professor |
| 1016 | Andrew | Byre | CINF | Associate Professor |
| 1017 | Deborah | Gump | ITEC | Professor |
| 1018 | Art | Allister | ARTS | Assistant Professor |
| 1019 | Benjamin | Yu | ITEC | Lecturer |
| 1020 | Katrina | Bajaj | ENGL | Lecturer |
| 1021 | Jorginlo | Neymar | ACCT | Assistant Professor |
+-------+----------+----------+----------+---------------------+
11 rows in set (0.00 sec)
mysql> SELECT s.fname, s.lname, s.advisor, f.`rank`
-> FROM student AS s INNER JOIN faculty AS f
-> ON (s.advisor = f.facId);
+-----------+---------+---------+---------------------+
| fname | lname | advisor | rank |
+-----------+---------+---------+---------------------+
| Tony | Hawk | 1011 | Professor |
| Mary | Hawk | 1011 | Professor |
| David | Hawk | 1011 | Professor |
| Catherine | Lim | 1017 | Professor |
| Larry | Johnson | 1017 | Professor |
| Linda | Johnson | 1015 | Professor |
| Lillian | Johnson | 1015 | Professor |
| Bill | Ching | 1018 | Assistant Professor |
| Linda | King | 1018 | Assistant Professor |
+-----------+---------+---------+---------------------+
9 rows in set (0.00 sec)