Database design 类别数必须大于1但小于5

Database design 类别数必须大于1但小于5,database-design,relational-database,Database Design,Relational Database,我想创建一个用于创建学术考试的数据库应用程序。为了简单起见,数据库包含以下3个表 问题: ProblemID int、标识、主键 问题nvarchar 解决方案nvarchar 类别: CategoryID int,标识,主键 类别nvarchar 问题类别: CategoryID int,复合主键 ProblemID int,复合主键 每个问题至少链接到一个类别,最多链接到5个类别。我的问题是如何确保这个约束在数据库级别保持不变 奖金问题: 是否建议使用以下设计替换上述设计 问题: Probl

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

问题:

ProblemID int、标识、主键 问题nvarchar 解决方案nvarchar 类别:

CategoryID int,标识,主键 类别nvarchar 问题类别:

CategoryID int,复合主键 ProblemID int,复合主键 每个问题至少链接到一个类别,最多链接到5个类别。我的问题是如何确保这个约束在数据库级别保持不变

奖金问题: 是否建议使用以下设计替换上述设计

问题:

ProblemID int、标识、主键 问题nvarchar 解决方案nvarchar CategoryID1 int,不为空 CategoryID2 int,null 类别3整数,空 CategoryID4整数,空 CategoryID5整数,空 类别:

CategoryID int,标识,主键 类别nvarchar
问题1:每个问题至少与一个类别相关

答:在Problems表上声明外键约束

Problems.ProblemID REFERENCES ProblemCategory.ProblemID
大概还有外键约束 在ProblemCategory上声明以引用Problems.ProblemID和Categories.CategoriId

问题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缺点:通过约束和相关的插入序列问题引入循环引用,或者在任何不支持延迟约束检查的引擎上都无法这样做。问题2缺点:约束的本质仍然是多行约束,a大多数引擎不支持这一点,b接受约束的引擎不可能在所有情况下都正确执行约束c无论如何强烈禁止性能