我有一个e-r模型,其中包含以下实体:Doctor, Patient, Human
并且Doctor -> Human
和Patient -> Human
之间存在生成关系。我正在尝试创建一个关系模型。那么,哪种模式是正确的:第一种或第二种?
1)
Human (Name, Surname, Sex, Address)
Doctor(License number, specification)
Patient(Insurance number, diagnosis)
2)
Doctor(Name, Surname, Sex, Address, License number, specification)
Patient(Name, Surname, Sex, Address, Insurance number, diagnosis)
并且实体人类不是必需的。
P.S。对关系模型不熟悉。
答案 0 :(得分:0)
两种型号都是“正确的”。但是插入和查询数据存在差异。
当您希望将数据标准化时,第一个是一个不错的选择(有关规范化的更多信息,请参阅http://en.wikipedia.org/wiki/Database_normalization)。但是,当您想查询所有医生或所有患者时,您必须加入两个表格 此外,当您插入新对象时,您必须插入两行(进入Human和Doctor / Patient) 当您使用OR-Mapper时,它会将您的数据转换为对象,您可以使用多态,因为您有一个共同的基础(人类)。
当速度很重要时,第二种可能性是一个很好的选择 当您想要查询所有医生/患者时会更快,因为不需要连接 但是当你想查询时,它会慢一些,例如来自医生和患者的所有地址
答案 1 :(得分:0)
这在很大程度上取决于您的要求。医生也可以成为患者吗?如果是,则需要像human
这样的基表。在这种情况下,doctor
和patient
应该有human
的外键。
如果您的DBMS支持,则另一种选择是使用表继承。在PostgreSQL中你可以例如做:
create table human
(
name text,
surname text,
sex char(1),
address text
);
create table doctor
(
license_number integer,
specifiction text
)
inherits (human);
create table patient
(
insurance_number integer,
diagnosis text
)
inherits (human);