【问题标题】:One table reference to two different tables with one foreign key, possible?一张表用一个外键引用两个不同的表,可能吗?
【发布时间】:2015-04-28 22:02:10
【问题描述】:

我不确定这是否只是一个蹩脚的愚蠢问题,但话又说回来,我只需要知道数据库设计究竟是如何工作的。

所以我有这个数据库,其中包含名为客户、当前调查结果和总体调查结果的表格,这些表格显示了客户填写的调查结果。

dbo.customers
----------
customerID
customerName
surveyID

dbo.currentsurveyresults
------------------------
surveyID
questionanswer1
questionanswer2

dbo.overallsurveyresults
------------------------
surveyID
questionanswer1
questionanswer2.a
questionanswer2.b

要了解我为什么这样命名/调用这些表:

与 currentsurveyresults 表(此表将在较早填写)相比,整体调查结果表应显示更详细的表(客户将在特定日期后填写另一份调查,以便稍后可以更具体地详细说明)。

如果我正确理解了主键/外键原理,我可以分配以下内容吗?:

customers.customerID (PK)
customers.surveyID (FK)
currentsurveyresults.surveyID(PK)
overallsurveyresults.surveyID(PK)

这样当我搜索客户时,我总是可以从两个结果表中获取我需要的信息? (这意味着一个外键引用两个主键)

所以问题实际上是:一个外键可以引用多个主键吗?如果没有,我应该添加另一个专门指定每个表的surveyID 列吗?

【问题讨论】:

  • 外键引用主键,而不是相反。任意数量的外键都可以引用给定的主键。
  • 谢谢,编辑我的问题。
  • "一个外键可以引用多个主键吗?"这意味着什么?一列引用两列 - 如何?
  • 您的客户表中有一个 SurveyId,您的客户只能参加一项调查吗?
  • 客户将在那个时刻对他们的意见进行调查,然后他们将在稍后的那个时刻填写一份包含类似问题和更高级问题的调查问卷。这些表格/调查是非常相似的表格/调查,但我不能让第二次调查覆盖第一次调查结果。所以我认为客户要么进行多次不同的调查,要么进行相同的调查(但后者可能会覆盖)。至于Politank-Z:是的,我认为这是不可能的,所以答案可能是否定的。 :P

标签: sql database normalization


【解决方案1】:

您的客户和调查之间的关系是错误的(根据您要执行的操作)。

你说

客户届时将对他们的意见进行调查,然后 稍后他们将填写一份包含类似问题及更多问题的调查 稍后关于他们的意见调查的高级问题

您希望客户参加不止一项调查。

创建一个调查结果表并将所有结果保存在该表中。 这样您就知道哪个客户参加了哪个调查。

CUSTOMERS                        SURVEYS               Questions
---------------             |--------------------|-----------------
CustomerId (int) PK         | SurveyId (int) PK  | QuestionId (int) PK
Name (nvarchar(500))        | Name (int)         | Quesion (nvarchar(500)


SURVEY QUESTIONS (Map N-Questions against N-Survey) (Re-use Questions different Surveys)
----------------
SurveyId (FK)
QuestionId (FK)


SURVEY RESULTS  
--------------
CustomerId  (id of Customer who took Survey)
SurveyId (Id of survey taken)
SurveyDateTime (Date Survey taken)
QuestionId (FK to Question table)
Answer     (Customer Answer)

如果您不想在不同的调查中重复使用问题,您可以将其添加到问题表中:

Questions
----------
QuestionId
Question
SurveyId (FK)

在这种方法中,以前的调查不会被覆盖。

所以我认为客户要么接受多项不同的调查,要么 相同(但后者可能会覆盖)

如果你想覆盖你只需要更新SURVEY RESULTS

【讨论】:

  • 感谢您的回答。我还在使用其他人创建/设计的数据库结构,所以我很难找出问题所在,非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2020-10-02
  • 2013-09-11
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 2016-08-19
相关资源
最近更新 更多