【问题标题】:Foreign key or boolean value in database数据库中的外键或布尔值
【发布时间】:2023-04-07 16:57:01
【问题描述】:

假设我有一个包含两个表 User 和 Store 的数据库。 让我们制定规则:

  1. 用户必须属于一个商店
  2. 一个商店可能有一个或多个用户

不过,商店可能有商店经理。最好的方法是什么? 在 Users 表中添加一个“is_store_manager”布尔列,或者在 Store 表中创建一个名为 manager_user_fk 的外键?我想这会创建多对多关系,这会很糟糕,但选择我认为的用户将是一个坚实的约束。最好的方法是什么?

【问题讨论】:

  • 我个人建议添加一个名为Role 的表和一个名为UserRole 的链接表。基于标志的方法绝对不会扩大规模,例如,您可能在较大的商店中也有副店长。拥有链接表UserRole 将允许用户拥有多个角色。

标签: sql foreign-keys relationship


【解决方案1】:

不要在 Store 上创建 fk。这有点多余,并且会使将来的一些 SQL 查询变得更加困难。

您可以添加另一个表 UserTypeManagerNon-Manager 类型。然后,您将在指向 UserType 的用户表上添加一个 fk。

编辑:

如果您希望一个用户被允许多个角色,您需要另一个join table

让我们调用之前的表表 Role,而不是 UserType,并添加另一个表 UserRole,它是 UserRole 之间的连接(它只有 2 列:外键User,以及Role 的外键。使用此设置,User 表上将没有任何 fk,因为此连接表将保存有关关系的所有信息。用户可以拥有尽可能多的信息到时候你喜欢的角色。

【讨论】:

  • 似乎是个好主意。但是,如果我希望用户同时拥有“store_manager”和“system_admin”角色,该怎么办?我该怎么做?
【解决方案2】:

替代已接受的解决方案,它只允许用户属于一种类型,您可以使用我一直在做的事情来替换布尔状态字段。创建一个名为UserManager 的表,其主键也是用户的外键。

UserManager 中有条目的任何用户都是经理。要获得经理,您只需使用UserManager 加入用户表。这还可以让您存储更多元数据(即您可以存储用户何时成为经理等)。

如果你想要一个AdminUser 表,你也可以做同样的事情。 AdminUser 表中的任何用户也是管理员。您可以让一个用户同时是(或没有,或一个)。以及存储更多关于该类型的元数据。

【讨论】:

  • 这听起来很聪明,正如您注意到存储更多元数据一样。感谢您的加入!
  • 这与接受的答案没有什么不同,只是您的类型不是动态的。您也可以通过拥有一个直通表将元数据存储在已接受的答案上。但是您可以存储的元数据必须是相同的类型。如果你有一个多表方法,那么你可以有不同类型的元数据。
猜你喜欢
  • 2011-05-31
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 2011-08-21
  • 1970-01-01
相关资源
最近更新 更多