Оба пользователя и учащиеся (сущности, а не таблицы) являются примерами Люди. Существуют атрибуты Пользователей, которые не принадлежат Студентам, и есть атрибуты Студентов, которые не принадлежат Пользователям. Кроме того, есть действия, которые пользователи могут принять, что студенты не могут принять и наоборот. Тем не менее, есть атрибуты, общие для обоих (имя, адрес, номер телефона и т. Д.), А также действия, которые могут выполняться (отправлять/получать сообщения, оставлять комментарии и т. Д.). Это сильно подразумевает отдельную таблицу, которая содержит общие атрибуты и допускает общие действия.
create table People(
ID MediumInt auto_generating primary key,
PType char(1) not null check(PType in('U', 'S')) -- User or Student
Name varchar(64) not null,
Address varchar(128),
..., -- other common attributes
constraint UQ_PeopleIDType unique(ID, PType) -- create anchor for FKs
);
create table Users(
UserID MediumInt not null primary key,
UType char(1) check(UType = 'U'),
..., -- attributes for Users
constraint FK_Users_People foreign key(UserID, UType)
references People(ID, PType)
);
create table Students(
StudentID MediumInt not null primary key,
SType char(1) check(SType = 'S'),
..., -- attributes for Students
constraint FK_Students_People foreign key(StudentID, SType)
references People(ID, PType)
);
Обратите внимание, что если человек создается с типом «S» (Student), то значение идентификатора для этого человека может быть вставлен только в таблицу Student.
Теперь все таблицы, которые должны относиться к Пользователям, могут быть FK для таблицы Users, а те, которые должны относиться к учащимся, могут быть FK в таблице Students. Когда таблицы могут ссылаться на них, они могут FK для таблицы People.