0

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

我有一个实体“产品”,应该链接到一个或多个利益相关者。我使用包含利益相关者名称的单独表“利益相关者”和链接产品和利益相关者的链接表“Product2Stakeholder”对这种关系进行建模。

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

  • a) 在“Product”表中定义一个外键字段,其中包含“Stakeholders”表中主要利益相关者的 Id(例如“MainStakeholder”),或
  • b) 如果利益相关者是该产品的主要利益相关者(即布尔列“IsMainStakeholder”),则在包含信息的“Product2Stakeholder”表中添加一列,或
  • c) 采取完全不同的方法?

谢谢。

4

2 回答 2

0

首先是公约建议。如果您有一个多对多解析器,在您的情况下是“Product2Stakeholder”,那么只需将该表命名为 ProductStakeholder。添加“2”是业余的,只会使您的表名更长。

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

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

在数据库中执行业务规则

要解决一种约束类型的问题,您可以添加 before insert 和 before update 触发器,这将不允许产品具有多个 isMainStakeholder 行。

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

  1. 将当前 isMainStakeholder 标志设置为 0。
  2. 为其他利益相关者设置新的 isMainStakeholder 标志为 1。
于 2020-04-27T09:41:02.430 回答
0

选项 b 并不能确保只有一个“主要利益相关者”。我想可以在 product2stakeholder 表上创建一个功能索引/虚拟列,这样做可以减少维护工作,但这缺乏透明度。(我故意不解释如何做到这一点,因为如果需要解释,这将证明这不是适合您的解决方案)。

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

于 2020-04-27T09:43:50.693 回答