模型 N-M 关系与 "main" 行的附加信息
Model N-M relationship with additional info of "main" row
我有一个关于如何在关系数据库中最好地建模关系的问题(我正在使用 MySQL):
我有一个实体 "Product" 应该与一个或多个利益相关者相关联。我使用包含利益相关者名称的单独 table "Stakeholders" 和链接产品和利益相关者的链接 table "Product2Stakeholder" 对这种关系进行建模。
但是,我还想为每个产品指定一个主要利益相关者。我想知道是否要这样做,我应该
- a) 在 "Product" table 中定义一个外键字段,其中包含来自 "Stakeholders" table 的主要利益相关者的 ID(例如 "MainStakeholder"), 或
- b) 向 "Product2Stakeholder" table 添加一列,其中包含利益相关者是否是该产品的主要利益相关者的信息(即布尔列 "IsMainStakeholder"),或者
- c) 采取完全不同的方法?
谢谢。
首先是约定俗成的建议。当你有一个多对多的解析器时,在你的例子中是 "Product2Stakeholder" 那么只需将其命名为 table ProductStakeholder。添加“2”是业余的,只会让你的 table 名字变长。
您应该实施选项 b。这始终允许您通过使用 isMainStakeholder 属性 = 1 或否的条件查询 ProductStakeholder,以相同的方式获取产品的利益相关者。
否则,您甚至在 ProductStakeholder table 中都没有可用的主要利益相关者,这应该告诉您这是一个错误。
在数据库中执行业务规则
要解决一种类型的约束问题,您可以在插入前和更新前添加触发器,这些触发器不允许产品有多个 isMainStakeholder 行。
话虽如此,您仍然需要编写某种类型的过程代码来添加或更改 isMainStakeholder,如果您有这些类型的触发器,在它们保护您的同时,您还必须按顺序处理更改:
- 将当前的 isMainStakeholder 标志设置为 0。
- 为其他利益相关者将新的 isMainStakeholder 标志设置为 1。
选项b不保证只有一个"main stakeholder"。我想可以在 product2stakeholder table 上创建一个功能性的 index/virtual 列,这样做可以减少维护工作量,但这缺乏透明度。 (我故意不解释如何做到这一点,因为如果需要解释,这将证明这不是适合您的解决方案)。
我会选择选项 A,但这真的是一个见仁见智的问题。
我有一个关于如何在关系数据库中最好地建模关系的问题(我正在使用 MySQL):
我有一个实体 "Product" 应该与一个或多个利益相关者相关联。我使用包含利益相关者名称的单独 table "Stakeholders" 和链接产品和利益相关者的链接 table "Product2Stakeholder" 对这种关系进行建模。
但是,我还想为每个产品指定一个主要利益相关者。我想知道是否要这样做,我应该
- a) 在 "Product" table 中定义一个外键字段,其中包含来自 "Stakeholders" table 的主要利益相关者的 ID(例如 "MainStakeholder"), 或
- b) 向 "Product2Stakeholder" table 添加一列,其中包含利益相关者是否是该产品的主要利益相关者的信息(即布尔列 "IsMainStakeholder"),或者
- c) 采取完全不同的方法?
谢谢。
首先是约定俗成的建议。当你有一个多对多的解析器时,在你的例子中是 "Product2Stakeholder" 那么只需将其命名为 table ProductStakeholder。添加“2”是业余的,只会让你的 table 名字变长。
您应该实施选项 b。这始终允许您通过使用 isMainStakeholder 属性 = 1 或否的条件查询 ProductStakeholder,以相同的方式获取产品的利益相关者。
否则,您甚至在 ProductStakeholder table 中都没有可用的主要利益相关者,这应该告诉您这是一个错误。
在数据库中执行业务规则
要解决一种类型的约束问题,您可以在插入前和更新前添加触发器,这些触发器不允许产品有多个 isMainStakeholder 行。
话虽如此,您仍然需要编写某种类型的过程代码来添加或更改 isMainStakeholder,如果您有这些类型的触发器,在它们保护您的同时,您还必须按顺序处理更改:
- 将当前的 isMainStakeholder 标志设置为 0。
- 为其他利益相关者将新的 isMainStakeholder 标志设置为 1。
选项b不保证只有一个"main stakeholder"。我想可以在 product2stakeholder table 上创建一个功能性的 index/virtual 列,这样做可以减少维护工作量,但这缺乏透明度。 (我故意不解释如何做到这一点,因为如果需要解释,这将证明这不是适合您的解决方案)。
我会选择选项 A,但这真的是一个见仁见智的问题。