Database design 类别数必须大于1但小于5
我想创建一个用于创建学术考试的数据库应用程序。为了简单起见,数据库包含以下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,标识,主键 类别nvarcharDatabase 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
问题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无论如何强烈禁止性能