父类型和子类型以及一对一关系

时间:2019-02-14 12:19:01

标签: sql sql-server database-design

我在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的Doctor,然后转到Dentist和Orthopedictables并在两个表中分配DoctorId值为1。我该如何执行它,以使医生只能在一张桌子上出现?

2 个答案:

答案 0 :(得分:0)

SQL Server中没有内置约束/功能来处理此问题。您需要为此编写自定义登录名。在过程中或触发。

您可以编写一个存储过程,将其插入这些表中。在插入之前,它将验证如果任何表中已经存在医生ID(如果是),则将自定义错误,否则过程将在相应的表中插入记录。

答案 1 :(得分:0)

我会对此安排不同。我将拥有3个表,一个Doctor表(如您已经拥有的),一个Specialist表和SpecialistAttributes表。

Doctor表包含所有Doctors的信息,很容易。

专家表包含您的SpecialistTypeID和SpecialistDescription等。 您的3个示例专家将在此表中分别排成一行。

SpecialistAttributes表包含专家所需的所有属性。在Doctor表中,您有一个外键来查找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 |