Sql 数据库设计与正确实践
我遇到了一个可能很常见的小问题,但我不知道如何搜索。例如,假设我们有一个包含以下表的数据库: 考试表-ExamID,姓名 试题表-ExamID、问题ID、名称Sql 数据库设计与正确实践,sql,database,Sql,Database,我遇到了一个可能很常见的小问题,但我不知道如何搜索。例如,假设我们有一个包含以下表的数据库: 考试表-ExamID,姓名 试题表-ExamID、问题ID、名称 我应该让问题ID是唯一的吗?我可以让它们在每一次考试中都是独一无二的,或者我可以让问题永远不会重复。这样做有什么优点/缺点吗?另外,在这两种情况下,主键应该是什么?使ExamId成为唯一的,因为考试不会重复一次又一次,但问题可以在每次考试中重复 示例:2014年学期末考试将不会在下一年再次举行,同一个标准化问题可能会反复提出。如果某个问题
我应该让问题ID是唯一的吗?我可以让它们在每一次考试中都是独一无二的,或者我可以让问题永远不会重复。这样做有什么优点/缺点吗?另外,在这两种情况下,主键应该是什么?使ExamId成为唯一的,因为考试不会重复一次又一次,但问题可以在每次考试中重复
示例:2014年学期末考试将不会在下一年再次举行,同一个标准化问题可能会反复提出。如果某个问题只属于某一个考试,则该问题将成为该考试的唯一问题。如果您希望在不同的考试中看到问题,那么它就不能依赖于考试的唯一性,它将独立于考试生成其键值 例如,订单/行项目关系是一个ID仅对另一个实体唯一的情况,其中客户下的订单可以有多个行项目。行项目除了它所属的订单之外没有任何意义,因此您可以通过订单id和每个订单从0开始的行项目编号来识别行项目。某种程度上取决于订单id和行项目编号 有很多可能性没有真正的“对”和“错” 我的想法可能是把它分成另一张表,这样这个问题就可以在考试中重复使用
Exam
----
ExamId int primary key,
Name varchar(500)
Questions
----
QuestionId int primary key,
Text varchar(500)
ExamQuestions
----
Id int primary key, -- this is optional, i just like "simple" primary keys rather than composite.
ExamId int FK, -- potentially create a unique constraint on examId/questionId
QuestionId int FK, -- potentially create a unique constraint on examId/questionId
questionOrder int -- this would allow a "ordering" of exam questions on a per exam basis.
有两张桌子
ExamID,Name
存储考试信息
考试问题-ExamID、QuestionID、Name
使用考试
表中的外键存储问题信息
这意味着您试图表示考试
和考试问题
表之间的一对多
关系,这意味着考试
有许多问题
,但问题
属于一个且仅属于一个考试
如果这是正确的,则在考试问题
表中设置问题ID
主键
如果这是不正确的,并且一个考试
有许多问题
并且问题
属于许多考试
,那么它是一个多对多
关系。在这种情况下,您应该有另一个多对多关系。这是三张桌子
ExamID-ExamID,Name
以ExamID
作为主键存储考试信息
考试问题-QuestionID,Name
以QuestionID
作为主键存储问题信息
考试问题关系-ExamID,QuestionID
表示与考试
表中的外键和考试问题
表中的外键的多对多关系。重要的问题不是问题ID是否应唯一。重要的问题是,“考试和问题之间关系的语义是什么?”答案告诉我们问题表的主键应该是什么
您的问题表与标识问题所属的[一个]考试的考试表具有外键关系。重要的是这种关系的性质
- 非识别关系是从属实体(本例中为问题)可以独立于相关“父”实体(本例中为表格)存在的关系。这方面的一个迹象是,一个问题是否可以从一个考试转移到另一个考试,或者一个问题是否根本不需要属于一个考试。如果是这样,问题表的主键应该只是问题id本身,因此它应该是唯一的且不可为空的 检查ID是否可为空取决于关系的基数 从问题到考试:是一对一(不可为零)还是零对一(可为零)
- 识别关系是指依赖实体(问题)仅存在于相关“父”实体(表)上下文中的关系。如果是这样,问题表的主键应该是复合键,包含考试ID(考试表的外键)和问题ID,考试ID和问题ID都不可为空 这将限制问题ID在考试ID范围内唯一:是否为 在这一点上,在整个表中是否唯一并不重要,因为您需要 用于标识特定问题的考试ID和问题ID