Супертип и подтипы и отношения один на один - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть следующие таблицы супертипа / нескольких подтипов в супертипе SQL Server: Доктор и подтипы: педиатр, ортопед и стоматолог

    create table Doctor
(
    DoctorID int primary key,
    Name varchar(100),
    -- add some other common attributes (all of vendor, sponsor, volunteer have) here.
)

create table Paediatrician
(
    PaediatricianId int primary key,
    DoctorID int foreign key references Doctor(DoctorID)
    -- add some other attributes related to Paediatrician here.
)

create table Orthopedic
(
    OrthopedicId int primary key,
    DoctorID int foreign key references Doctor(DoctorID)
    -- add some other attributes related to Orthopedic here.
)

create table Dentist
(
    DentistId int primary key,
    DoctorID int foreign key references Doctor(DoctorID)
    -- add some other attributes related to Dentisthere.
)

Моя бизнес-логика заключается в том, что врач может быть либо педиатром, стоматологом илиортопедический.Не может быть больше, чем один из подтипов.На основании вышеупомянутой конструкции это не применяется.Я могу создать Доктора с Id = 1, а затем перейти к Dentist и Orthopedictables и назначить значение DoctorId 1 в обеих таблицах.Как применить это, чтобы врач мог присутствовать только за одним столом?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Я бы устроил это немного по-другому.У меня будет 3 таблицы, таблица «Доктор» (как у вас уже есть), таблица «Специалист» и таблица «Специалист по атрибутам».

Таблица «Доктор» содержит всю информацию врачей, просто.

Таблица «Специалист» содержит ваш SpecialistTypeID, SpecialistDescription и т. Д. Каждый из 3 примеров специалистов будет по одной строке в этой таблице.

Таблица SpecialistAttributes содержит все атрибуты, необходимые для специалистов.В вашей таблице «Доктор» у вас есть внешний ключ для поиска SpecialistTypeID, поэтому может быть только 1, тогда у SpecialistType есть несколько SpecislaistAttibutes, на которые он может ссылаться.

Другое преимущество организации данных таким образомэто то, что вам нужно добавлять какие-либо роли или атрибуты специалистов, вам не нужно менять структуру базы данных, просто добавьте больше строк.

Doctor Table
    | ID | Name     | Specialist_FK |
    ---------------------------------
    | 1  | Smith    | 2             |
    | 2  | Davies   | 3             |
    | 3  | Jones    | 3             |

Specialist Table
    | ID | Speciality    |
    ----------------------
    | 1  | Paediatrician |
    | 2  | Orthopedic    |
    | 3  | Dentist       |

SpecialistAttribute Table
    | ID | SpecialityID+FK | Description          | Other      |
    ------------------------------------------------------------
    | 1  | 1               | Paediatrician Info 1 | Other Info |
    | 2  | 1               | Paediatrician Info 2 | Other Info |
    | 3  | 2               | Orthopedic Info 1    | Other Info |
    | 4  | 2               | Orthopedic Info 1    | Other Info |
    | 5  | 3               | Dentist Info 1       | Other Info |
    | 6  | 4               | Dentist Info 1       | Other Info |
0 голосов
/ 14 февраля 2019

На сервере SQL нет встроенных ограничений / функций, чтобы справиться с этим.Вы должны написать собственный логин для этого.Либо в процедуре, либо в триггере.

Вы можете написать хранимую процедуру, которая будет ответственна за вставку в эти таблицы.перед вставкой будет подтверждено, что если идентификатор доктора уже существует в любой из таблиц, и если да, то будет выдано сообщение об ошибке, иначе процедура вставит запись в соответствующую таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...