我们说我有一个包含两个表User,Store的数据库。 让我们制定规则:
虽然商店可能有商店经理。对此最好的方法是什么?
添加' is_store_manager' Users表中的boolean列,或者在Store表中创建一个名为manager_user_fk
的外键?我想这会创建一个多对多的关系,这会很糟糕,但选择我认为的用户将是一个坚实的约束。什么是最好的方法?
答案 0 :(得分:1)
不要在Store
上创建fk。这有点多余,会使未来的SQL查询变得更难。
您可以使用UserType
和Manager
类型添加另一个表格Non-Manager
。然后,您将在Users表上添加指向UserType的fk。
修改强>
如果您希望允许用户拥有多个角色,则需要另一个join table
:
让我们调用上一个表格Role
,而不是UserType
,然后添加另一个表UserRole
,即User
和Role
之间的联接(它只有2列:User
的外键和Role
的外键。使用此设置,User
表上没有任何fk,因为此连接table会保存关于关系的所有信息。用户可以拥有你想要的任意数量的角色。
答案 1 :(得分:1)
可接受的解决方案的替代方案,它只允许用户属于一种类型,您可以使用我一直在做的替换布尔状态字段。创建一个名为UserManager
的表,主键也是User的外键。
在UserManager
中有条目的任何用户都是经理。要获取经理,您只需使用UserManager
加入用户表。这也允许您存储更多元数据(即,您可以在用户成为经理时存储等)。
然后,如果你想要一个AdminUser
表,你也会做同样的事情。 AdminUser表中的任何用户也是管理员。您可以让用户同时(或者没有,或者一个)。随着存储更多关于类型的元数据。