Database 一个细节可以有两个主元素吗?

Database 一个细节可以有两个主元素吗?,database,delphi,ms-access,Database,Delphi,Ms Access,我一直在苦苦思索如何为有人(非匿名)填写问卷的情况建立一个数据库。人与调查问卷之间的关系是多对多的——一个人填写多份调查问卷,一份调查问卷由多人填写。所以,我有一个PERSON表、一个问卷表和一个join表(PERSON-inventory) 但是我应该把问卷中的信息放在哪里呢?问卷项目分为两部分(两个字段),一部分包含人们将回答的问题或陈述(项目),另一部分包含回答的空间(回答)。假设所有这些都放在一个单独的表中,这个表与什么连接?(问卷表…一份问卷可以有多个问卷项目?) 而且,如果我对最后一

我一直在苦苦思索如何为有人(非匿名)填写问卷的情况建立一个数据库。人与调查问卷之间的关系是多对多的——一个人填写多份调查问卷,一份调查问卷由多人填写。所以,我有一个PERSON表、一个问卷表和一个join表(PERSON-inventory)

但是我应该把问卷中的信息放在哪里呢?问卷项目分为两部分(两个字段),一部分包含人们将回答的问题或陈述(项目),另一部分包含回答的空间(回答)。假设所有这些都放在一个单独的表中,这个表与什么连接?(问卷表…一份问卷可以有多个问卷项目?)


而且,如果我对最后一点的看法是正确的,我一生都无法想出如何建立一个DB网格(在Delphi中)来显示所选问卷和所选人员的项目和响应字段。(我知道如何使用db感知组件编码主/细节关系,但这就像是两个主/细节一样。)

您将有一个表格问卷-项目(问题)和一个单独的表格问卷-回答(答案),因为一个问题会有多个答案,这些答案来自多个人。前者获取问卷的外键,而后者获取问卷项目和人员的外键

事实上,可以省略个人调查问卷表,因为可以从其他表中查询这些信息。因此,对于设计,我建议:

  • 调查:ID(PK)、说明等
  • 用户:ID(主键)、名称等
  • 问题:ID(PK)、调查ID(FK)、问题等
  • 答案:ID(PK)、问题ID(FK)、用户ID(FK)、答案等
DBGrid的视图将基于以下查询:

SELECT 
  Question, 
  Answer,
  ...
FROM 
  Questions INNER JOIN Answers ON Questions.ID = Answers.QuestionID
WHERE
  Questions.SurveyID = :SurveyID AND Answers.UserID = :UserID
在GUI的另一部分中,选择
SurveyID
UserID
参数

另外,作为单独联接表的替代,用于获取调查和用户的查询如下所示:

SELECT
  Surveys.ID,
  Users.ID
FROM
  Users INNER JOIN (
    Answers INNER JOIN (
      Questions INNER JOIN (
        Surveys
      ) ON Questions.SurveyID = Surveys.ID
    ) ON Answers.QuestionID = Questions.ID
  ) ON Users.ID = Answers.UserID
GROUP BY
  Surveys.ID,
  Users.ID

您将有一个表格问卷-项目(问题)和一个单独的表格问卷-回答(答案),因为一个问题有多个答案,这些答案来自多个人。前者获取问卷的外键,而后者获取问卷项目和人员的外键

事实上,可以省略个人调查问卷表,因为可以从其他表中查询这些信息。因此,对于设计,我建议:

  • 调查:ID(PK)、说明等
  • 用户:ID(主键)、名称等
  • 问题:ID(PK)、调查ID(FK)、问题等
  • 答案:ID(PK)、问题ID(FK)、用户ID(FK)、答案等
DBGrid的视图将基于以下查询:

SELECT 
  Question, 
  Answer,
  ...
FROM 
  Questions INNER JOIN Answers ON Questions.ID = Answers.QuestionID
WHERE
  Questions.SurveyID = :SurveyID AND Answers.UserID = :UserID
在GUI的另一部分中,选择
SurveyID
UserID
参数

另外,作为单独联接表的替代,用于获取调查和用户的查询如下所示:

SELECT
  Surveys.ID,
  Users.ID
FROM
  Users INNER JOIN (
    Answers INNER JOIN (
      Questions INNER JOIN (
        Surveys
      ) ON Questions.SurveyID = Surveys.ID
    ) ON Answers.QuestionID = Questions.ID
  ) ON Users.ID = Answers.UserID
GROUP BY
  Surveys.ID,
  Users.ID

项目和响应应为不同的表格;它们之间存在一对多的关系。(一个项目属于调查问卷,但许多人可以提供该项目的答案,因此每个项目都有许多答案。)

我推荐这样的设置:

PERSON  <---- PERSON_QUESTIONNAIRE ----> QUESTIONNAIRE
                        ^                       ^
                        |                       |
                        |                       |
                     RESPONSE      ----->     ITEM
个人调查问卷
^                       ^
|                       |
|                       |
答复------>项目

我对如何设置DB网格(不是Delphi专家)没有任何建议,但有时解决设计难题将有助于技术解决方案变得更清晰。

项目和响应应该是不同的表;它们之间存在一对多的关系。(一个项目属于调查问卷,但许多人可以提供该项目的答案,因此每个项目都有许多答案。)

我推荐这样的设置:

PERSON  <---- PERSON_QUESTIONNAIRE ----> QUESTIONNAIRE
                        ^                       ^
                        |                       |
                        |                       |
                     RESPONSE      ----->     ITEM
个人调查问卷
^                       ^
|                       |
|                       |
答复------>项目

我对如何设置DB网格(不是德尔福大师)没有任何建议,但有时解决设计难题将有助于技术解决方案变得更清晰。

是将问卷-回答链接到人,还是将问卷-回答链接到人(如Alanyst建议的)?就像我说的:回答将链接到项目和人。(答案链接到问题和用户,很抱歉重命名)。请注意,只要用户只回复同一份问卷一次,此设计就有效。如果他们需要能够重新填写问卷,则需要填写个人问卷表,并且回答(答案)需要引用该表,而不是直接引用个人。问卷回答是链接到个人,还是链接到个人问卷(如Alanyst所建议的)?如我所说:回答将链接到项目和个人。(答案链接到问题和用户,很抱歉重命名)。请注意,只要用户只回复同一份问卷一次,此设计就有效。如果他们需要能够重新填写问卷,则需要填写个人问卷表,并且回答(答案)将需要引用该表,而不是直接引用个人,但是这个设置并没有真正让你知道哪个人做出了什么反应。它确实是:
response-->person\u inventory-->person
你是对的,它确实知道,我可能在想别的事情。但是关于这个设置还有一件事我不确定它是否得到了重视(至少你没有明确说明它是否得到了重视)。信息技术