我有一个场景,我有两个表,person_natural
并且person_legal
.
情况1:
我有员工、农民、客户和供应商。我是否应该在每个表(person_natural
或person_legal
)中都有一个枚举来指示人员类型(例如,在person_natural
我将调用一个列type
来说明它是雇员、农民还是客户),还是应该为每种类型创建一个表person 并使用 FK 将其链接到主表?
我问这个是因为员工和客户有额外的列,例如员工有工资,客户有信用额度。如果我将这些列放在主表中,则对于某种类型的人,该列将始终为 NULL。
例子:
person_natural
employee -> FK person_natural
farmer -> FK person_natural
customer -> FK person_natural
或者
person_natural -> type_person (employee, farmer, customer)
案例2:
我有一个附件表和一个地址表。如果我有表person_natural
和person_legal
,我通常必须为每个表创建一个连接表:
person_natural
person_natural_attachment
person_natural_address
person_legal
person_legal_attachment
person_legal_address
在这种情况下,创建一个名为 的表person
并将 FK 保留在person_natural
and中是否正确(尤其是在数据库规范化之后) person_legal
,这样就不必创建额外的连接表?
person
person_natural -> FK person
person_legal -> FK person
person_attachment
person_address
在这种情况下,如果我有一个,我可以通过加入,然后person_natural
加入表格来轻松访问附件。person
person_attachment
这两种情况的推荐做法是什么?我愿意接受任何建议或推荐。感谢您的时间。
是的,这是正确的,也是正常化所必需的。您将得到一个子类型簇(FK 也将是和
person
的 PK )。person_natural
person_legal
为了对自然实体和法人实体进行建模,您很可能需要一个独占子类型,其中Person是PersonNatural XOR PersonLegal,因此您需要实现一些额外的结构和约束。另请查看此答案以了解更多详细信息。
使用类似的方法,您可以对雇员、农民、客户和供应商子类型进行建模。也许在这种情况下,非独占子类型更合适,其中Person至少是PersonEmployee、PersonFarmer、PersonCustomer和PersonSupplier之一。