sql一对多

sql一对多,sql,tsql,Sql,Tsql,我只是想确定这是一对多的关系 我有一个调查,它有一个复选框列表,用户可以在复选框列表中选择多个问题。所以我摆了三张桌子 SurveyResults SurveyProblems ProblemTypes ------------- -------------- ------------- SurveyResultID Surv

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

我有一个调查,它有一个复选框列表,用户可以在复选框列表中选择多个问题。所以我摆了三张桌子

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

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

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

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

但据我所知,你的结构是正确的

多对多示例: 在下面的示例中,
SurveyResultID
有两个可能的值,并且
ProblemTypeID
1,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)
真正的一对多结构不需要中间表将调查与问题联系起来。相反,它可以将外键直接链接到
ProblemType
表中的
SurveyResultID

一对多结构:
即使您将一对多缩进,而不是您定义的多对多缩进,如果您将来需要扩展到多对多,您当前的结构也会更加灵活。。。尽管查询是否有额外的联接要复杂一点。

我认为您是对的,但为什么需要SurveyProblemsID?使用SurveyResultID和ProblemTypeID作为复合主键,以便问题类型不能重复

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

这实际上是一种多对多的关系。

我指的是一对多的关系……这是一对多,对吗?这是多对多,兄弟。调查问题Sid应该只有一个4,对吗?我认为这是一个多对多的问题……我认为上面列出的一对多结构存在一个问题,我目前只有三种问题类型,我是否应该避免在问题类型表中多次列出相同的值?这有意义吗?基本上,通过这种设置,我可以有100行,所有这些行都在ProblemName列中列出Problem1。这就是为什么我试图创建一个ProblemType表,所以我没有重复这样的值。不确定最佳实践是什么。重复ProblemName违反第三范式。从键列派生的非键列。@user1202606如果只有3种问题类型,并且问题类型不是调查结果唯一拥有的,则必须使用定义的多对多关系。
SurveyResults             SurveyProblems                 ProblemTypes                   
-------------             --------------                 -------------
SurveyResultID PK         SurveyResultID PK, FK          ProblemTypeID  PK
                          ProblemTypeID  PK, KK          ProblemName