Database design 设计人与角色的关系

Database design 设计人与角色的关系,database-design,foreign-keys,Database Design,Foreign Keys,我们正在设计一个数据库,它有一个名为Person的简单表。每个人都可以有几个与其相关的角色,如客户、员工、经理等。每个角色都有一个属性列表,因此每个角色也有一个表 现在我们需要将一个人连接到他的角色集。这样做的最佳方式是什么 到目前为止,我们已经提出了两种设计,但我们不确定哪一种在扩展可能引入的其他角色以及保持数据库内数据完整性方面是最佳的 我们的第一个设计将有一个映射具有特定角色的人的表,以及该角色表中的id。此表中的一个条目如下所示 personid: 5 role: 2 (manager)

我们正在设计一个数据库,它有一个名为Person的简单表。每个人都可以有几个与其相关的角色,如客户、员工、经理等。每个角色都有一个属性列表,因此每个角色也有一个表

现在我们需要将一个人连接到他的角色集。这样做的最佳方式是什么

到目前为止,我们已经提出了两种设计,但我们不确定哪一种在扩展可能引入的其他角色以及保持数据库内数据完整性方面是最佳的

我们的第一个设计将有一个映射具有特定角色的人的表,以及该角色表中的id。此表中的一个条目如下所示

personid: 5
role: 2 (manager)
roleid: 6 (the id to look for in the manager table)
虽然此解决方案将随着流程后期添加的其他角色而扩展,但其缺点是无法通过使用外键自然地强制执行数据完整性

另一种设计将为每个角色提供一个映射表。因此,将有一个StaffMemberMapping表,其条目类似于

personId: 5
staffMemberId: 12
此解决方案通过FKs强制执行数据完整性,但也要求我们在每次查找一个人时查看多个表,以查看他与哪些角色相关


这些解决方案中哪一个是有利的?或者更好,如果还有第三种更棒的解决方案,请提供建议。

第二种解决方案似乎是自然选择,因为角色是对象对之间的关系,您可以在具有单独表的关系数据库中建模单独的关系。我建议只有在有理由这样做的情况下才偏离规范化数据库设计,因此我将使用(2),并且只有在存在性能问题的情况下,然后对数据库进行反规范化,并在(2)之外添加(1)以便于查询