Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库设计与正确实践_Sql_Database - Fatal编程技术网

Sql 数据库设计与正确实践

Sql 数据库设计与正确实践,sql,database,Sql,Database,我遇到了一个可能很常见的小问题,但我不知道如何搜索。例如,假设我们有一个包含以下表的数据库: 考试表-ExamID,姓名 试题表-ExamID、问题ID、名称 我应该让问题ID是唯一的吗?我可以让它们在每一次考试中都是独一无二的,或者我可以让问题永远不会重复。这样做有什么优点/缺点吗?另外,在这两种情况下,主键应该是什么?使ExamId成为唯一的,因为考试不会重复一次又一次,但问题可以在每次考试中重复 示例:2014年学期末考试将不会在下一年再次举行,同一个标准化问题可能会反复提出。如果某个问题

我遇到了一个可能很常见的小问题,但我不知道如何搜索。例如,假设我们有一个包含以下表的数据库:

考试表-ExamID,姓名

试题表-ExamID、问题ID、名称


我应该让问题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