【问题标题】:The number of categories must be greater than one but fewer than five类别数必须大于 1 但小于 5
【发布时间】:2014-04-23 17:42:48
【问题描述】:

我想创建一个用于创建学术考试的数据库应用程序。为简单起见,该数据库包含以下 3 个表。

问题:

  • ProblemID(整数、身份、主键)
  • 问题 (nvarchar)
  • 解决方案 (nvarchar)

类别:

  • CategoryID(整数、身份、主键)
  • 类别 (nvarchar)

问题类别:

  • CategoryID(整数,复合主键)
  • ProblemID(整数,复合主键

每个问题都与至少一个类别和最多 5 个类别相关联。我的问题是如何确保此约束在数据库级别保持?

额外问题:

是否推荐以下设计替代上述设计?

问题:

  • ProblemID(整数、身份、主键)
  • 问题 (nvarchar)
  • 解决方案 (nvarchar)
  • CategoryID1(整数,非空)
  • CategoryID2 (int, null)
  • CategoryID3 (int, null)
  • CategoryID4 (int, null)
  • CategoryID5 (int, null)

类别:

  • CategoryID(整数、身份、主键)
  • 类别 (nvarchar)

【问题讨论】:

标签: database-design relational-database


【解决方案1】:

问题 1:每个问题都与至少一个类别相关联。

答案:在 Problems 表上声明一个外键约束。

Problems.ProblemID REFERENCES ProblemCategory.ProblemID

(大概还有外键约束 在 ProblemCategory 上声明以引用 Problems.ProblemID 和 Categories.CategoryID。)

问题 2:每个问题最多关联到 5 个类别。

答案:在 ProblemCategory 表上声明一个约束。 (正如布兰科指出的那样。)

WHERE (SELECT MAX(CatCount)
       FROM (SELECT COUNT(*) AS CatCount
             FROM ProblemCategory
             GROUP BY ProblemID)
      ) <= 5

问题 3:设计每个问题记录最多包含五个 Cat ID。

回答:不,这是一个糟糕的主意。 (阅读有关规范化的任何文本。)考虑:

  • 如何查询“归一化”类别的所有问题?
  • 您将如何防止同一只猫在给定问题上重复出现?
  • 存在 Cat ID3 和 ID5 但 ID4 为空的问题是什么意思?

【讨论】:

  • 如果您指出尝试应用 Q1 和 Q2“解决方案”的缺点,那将是一个更可敬的答案。 Q1 缺点:引入“通过约束进行循环引用”和相关的插入序列问题,或者说,无法在任何不支持延迟约束检查的引擎上执行此操作。 Q2 缺点:约束的本质仍然是它是一个多行约束,并且 (a) 大多数引擎不支持这一点,(b) 那些接受它的引擎不太可能在所有情况下都正确执行它 (c) 强烈无论如何在性能上都有禁忌
猜你喜欢
  • 2017-04-10
  • 2021-12-07
  • 2017-10-29
  • 2017-08-17
  • 2013-10-15
  • 2013-05-27
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多