一个细节可以有两个主人吗?

时间:2012-06-28 19:43:34

标签: database delphi ms-access

我正在努力设置一个数据库,以便你有人(非匿名)填写调查问卷。人与问卷之间的关系是多对多的 - 一个人完成多份问卷,一份问卷由多人完成。所以,我有一个PERSON表,一个QUESTIONNAIRE表和一个连接表(PERSON-QUESTIONNAIRE)。

但是,我在哪里将信息显示在问卷中呢?问卷项目有两个部分(两个字段),一个带有人们将回复的问题或陈述(ITEM),另一个带有响应空间(RESPONSE)。假设所有这些都在一个单独的表中,这个表加入了什么? (QUESTIONNAIRE表... QUESTIONNAIRE可以有多个QUESTIONNAIRE-ITEMS?)

而且,如果我对最后一点是正确的,我不能在我的生活中弄清楚如何设置一个DB网格(在Delphi中),它将显示所选调查问卷的ITEM和RESPONSE字段选定的人。 (我知道如何使用支持db的组件来编写主/详细关系,但这就像是有两个主人的细节。)

2 个答案:

答案 0 :(得分:7)

您将有一个表QUESTIONNAIRE-ITEMS(问题)和一个单独的表QUESTIONNAIRE-RESPONSES(答案),因为单个问题将有多个答案,来自多个人的答案。前者获取QUESTIONNAIRE的外键,而后者获取QUESTIONNAIRE-ITEMS和PERSON的外键。

实际上,可以省略PERSON-QUESTIONNAIRE表,因为可以从其他表中查询该信息。所以对于设计我建议:

  • 调查:ID(PK),描述等......
  • 用户:ID(PK),姓名等......
  • 问题:ID(PK),SurveyID(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的另一部分中,您可以选择SurveyIDUserID参数。

作为奖励:作为单独联接表的替代方案,获取调查和用户的查询将如下所示:

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

答案 1 :(得分:3)

ITEM和RESPONSE应该是不同的表格;他们之间有一对多的关系。 (一个项目属于问卷,但很多人可以提供对该项目的回复,因此每个项目都会有很多回复。)

我推荐这样的设置:

PERSON  <---- PERSON_QUESTIONNAIRE ----> QUESTIONNAIRE
                        ^                       ^
                        |                       |
                        |                       |
                     RESPONSE      ----->     ITEM

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

相关问题