使用实例计数限制实现多对多的最佳方法是什么?

时间:2014-03-18 12:23:53

标签: sql database-design

假设我正在为预算数据创建一个模型,其中预算有一组与之相关的成本,目前有5种成本类型,每个预算应该有一个全部5个实例(所以5个条目完全在每个预算成本中)。如果我将这种关系建模为多对多,如此:

Budget
  - id
  - name
  - available_amount

Cost
  - budget_id
  - cost_type_id
  - value

Cost Type
  - cost_type_id
  - label

确保5个实例的数据完整性的最佳方法是什么?我想确保每个预算都有与之关联的每个定义类型的成本。这是必须在应用程序级别完成的事情,还是有更好的技术可以使数据库承担数据完整性责任而不为预算表中的每个成本添加一列?

我想知道这是否是一个愚蠢的问题......

2 个答案:

答案 0 :(得分:2)

如果不在预算表中添加不可为空的列,您可以将过程代码编写为一堆触发器,或者作为存储过程(这也需要严格控制权限)。

在关系级别,您使用数据库约束实现此要求,但是还没有SQL dbms支持数据库约束。 (Chris Date将数据库约束定义为"相互关联两个或多个不同的relvars"的约束。)

答案 1 :(得分:1)

通过联结表中的复合键Cost Type自然地确保每个预算的最大为5(或{budget_id, cost_type_id}中的当前行数) Cost

确保最小也是5是可能的,但非常笨拙 1 以声明方式实现,并且在应用程序代码中得到更好的处理。

您应该尽可能使用数据库级声明性约束,但不应仅仅为了避免几个明确定义的应用程序级约束而破坏数据模型。 2 总而言之,你的模型看起来很好,就像它一样。


1 例如,您可以在{{1}中拥有5个非NULL value字段(以及可能还有5个label字段) } table,每种成本类型一个。 BudgetCost Type表根本不存在。我不必告诉你这种模式会有多么严格和“无法解决”。

2 BTW,当强制Cost的总和不超过Cost.value时,你将面临类似的困境。