模型 N-M 关系与 "main" 行的附加信息

Model N-M relationship with additional info of "main" row

我有一个关于如何在关系数据库中最好地建模关系的问题(我正在使用 MySQL):

我有一个实体 "Product" 应该与一个或多个利益相关者相关联。我使用包含利益相关者名称的单独 table "Stakeholders" 和链接产品和利益相关者的链接 table "Product2Stakeholder" 对这种关系进行建模。

但是,我还想为每个产品指定一个主要利益相关者。我想知道是否要这样做,我应该

谢谢。

首先是约定俗成的建议。当你有一个多对多的解析器时,在你的例子中是 "Product2Stakeholder" 那么只需将其命名为 table ProductStakeholder。添加“2”是业余的,只会让你的 table 名字变长。

您应该实施选项 b。这始终允许您通过使用 isMainStakeholder 属性 = 1 或否的条件查询 ProductStakeholder,以相同的方式获取产品的利益相关者。

否则,您甚至在 ProductStakeholder table 中都没有可用的主要利益相关者,这应该告诉您这是一个错误。

在数据库中执行业务规则

要解决一种类型的约束问题,您可以在插入前和更新前添加触发器,这些触发器不允许产品有多个 isMainStakeholder 行。

话虽如此,您仍然需要编写某种类型的过程代码来添加或更改 isMainStakeholder,如果您有这些类型的触发器,在它们保护您的同时,您还必须按顺序处理更改:

  1. 将当前的 isMainStakeholder 标志设置为 0。
  2. 为其他利益相关者将新的 isMainStakeholder 标志设置为 1。

选项b不保证只有一个"main stakeholder"。我想可以在 product2stakeholder table 上创建一个功能性的 index/virtual 列,这样做可以减少维护工作量,但这缺乏透明度。 (我故意不解释如何做到这一点,因为如果需要解释,这将证明这不是适合您的解决方案)。

我会选择选项 A,但这真的是一个见仁见智的问题。