1

我只是想确保这是一对多的关系。

我有一个调查,其中有一个复选框列表,用户可以在复选框列表中选择多个问题。所以我设置了三个表

SurveyResults             SurveyProblems                 ProblemTypes                   
-------------             --------------                 -------------
SurveyResultID            SurveyProblemsID               ProblemTypeID
                          SurveyResultID                 ProblemName
                          ProblemTypeID

如果调查可能有多种问题类型,这是创建数据库表的正确方法吗?这是一对多的关系,对吗?

4

3 回答 3

2

从技术上讲,这是一个多对多的关系,因为在这种结构下,一个ProblemTypeID可以与多个相关联,SurveyResultID 除非您定义一个强制唯一性的键SurveyProblems.ProblemTypeID

但就我对您的结构的理解而言,这将正常工作。

多对多示例:

在下面的示例中, 有两个可能的值SurveyResultID,并且ProblemTypeID1,3 都用在 SurveyResultID中,这使得它是多对多的。

SurveyProblemsID SurveyResultID ProblemTypeID
1                1              1
2                1              2
3                1              3
4                2              1
5                2              3

请注意,代理键SurveyProblemsID并不是绝对必要的,考虑到您需要通过在它们之间SurveyResultID, ProblemTypeID定义复合主键来强制它们之间的唯一性。

PRIMARY KEY (SurveyResultID, ProblemTypeID)

真正的一对多结构不需要中间表来将调查与问题联系起来。相反,它可以直接将外键链接到SurveyResultIDProblemType中:

一对多结构:

SurveyResults           ProblemType
---------------------------------------------------
SurveyResultID          ProblemTypeID
                        ProblemName
                        SurveyResultID (foreign key)

即使您确实缩进了一对多而不是您定义的多对多,如果您将来需要扩展为多对多,您当前的结构可能会更加灵活......甚至虽然查询是否有额外的连接有点复杂。

于 2012-08-30T20:43:43.350 回答
0

我认为你说得对,但为什么需要 SurveyProblemsID?使用 SurveyResultID 和 ProblemTypeID 作为复合主键,因此问题类型不能重复。

SurveyResults             SurveyProblems                 ProblemTypes                   
-------------             --------------                 -------------
SurveyResultID PK         SurveyResultID PK, FK          ProblemTypeID  PK
                          ProblemTypeID  PK, KK          ProblemName

这实际上是多对多。

于 2012-08-30T21:12:48.750 回答
0

创建一个调查表,然后为问题创建一个查找表,并创建第三个表以将问题与调查表相关联。

于 2012-08-30T20:43:00.890 回答