【问题标题】:What is the best way to implement a many to many with instance count restraints?使用实例计数限制实现多对多的最佳方法是什么?
【发布时间】:2014-03-18 21:04:42
【问题描述】:

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

Budget
  - id
  - name
  - available_amount

Cost
  - budget_id
  - cost_type_id
  - value

Cost Type
  - cost_type_id
  - label

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

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

【问题讨论】:

    标签: sql database-design


    【解决方案1】:

    如果不向预算表中添加不可为空的列,您就只能将程序代码编写为一堆触发器或存储过程(这也需要对权限进行严格控制)。

    在关系级别,您可以使用数据库约束来实现此要求,但目前还没有 SQL dbms 支持数据库约束。 (Chris Date 将数据库约束定义为“将两个或多个不同的相关变量相互关联”的约束。)

    【讨论】:

      【解决方案2】:

      确保每个预算的最大值为 5(或 Cost Type 中的当前行数)自然是通过连接表 Cost 中的复合键 {budget_id, cost_type_id} 实现的。

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

      您应该尽可能使用数据库级别的声明性约束,但不应仅仅为了避免一些明确定义的应用程序级别约束而破坏数据模型。2 总而言之,你的模型对我来说看起来不错。


      1 例如,Budget 表中可能只有 5 个非 NULL value 字段(可能还有 5 个 label 字段),每个字段一个成本类型。 Cost TypeCost 表根本不存在。我不必告诉你这种模型有多么僵化和“不可改变”。

      2 顺便说一句,在强制 Cost.value 的总和不超过 Budget.available_amount 时,您将面临类似的困境。

      【讨论】:

      • 小问题:如果 available_amount 表示在已经产生的费用/成本之后,仍然可以从该预算中花费的金额,那么这是 ">= 0" 的简单 CHECK 约束。缺点当然是数据库更新的所有后果。
      猜你喜欢
      • 1970-01-01
      • 2012-02-28
      • 2015-05-31
      • 2021-10-17
      • 2018-01-04
      • 1970-01-01
      • 2011-01-09
      • 2012-03-31
      • 2015-08-21
      相关资源
      最近更新 更多