我正在努力设置一个数据库,以便你有人(非匿名)填写调查问卷。人与问卷之间的关系是多对多的 - 一个人完成多份问卷,一份问卷由多人完成。所以,我有一个PERSON表,一个QUESTIONNAIRE表和一个连接表(PERSON-QUESTIONNAIRE)。
但是,我在哪里将信息显示在问卷中呢?问卷项目有两个部分(两个字段),一个带有人们将回复的问题或陈述(ITEM),另一个带有响应空间(RESPONSE)。假设所有这些都在一个单独的表中,这个表加入了什么? (QUESTIONNAIRE表... QUESTIONNAIRE可以有多个QUESTIONNAIRE-ITEMS?)
而且,如果我对最后一点是正确的,我不能在我的生活中弄清楚如何设置一个DB网格(在Delphi中),它将显示所选调查问卷的ITEM和RESPONSE字段选定的人。 (我知道如何使用支持db的组件来编写主/详细关系,但这就像是有两个主人的细节。)
答案 0 :(得分:7)
您将有一个表QUESTIONNAIRE-ITEMS(问题)和一个单独的表QUESTIONNAIRE-RESPONSES(答案),因为单个问题将有多个答案,来自多个人的答案。前者获取QUESTIONNAIRE的外键,而后者获取QUESTIONNAIRE-ITEMS和PERSON的外键。
实际上,可以省略PERSON-QUESTIONNAIRE表,因为可以从其他表中查询该信息。所以对于设计我建议:
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
答案 1 :(得分:3)
ITEM和RESPONSE应该是不同的表格;他们之间有一对多的关系。 (一个项目属于问卷,但很多人可以提供对该项目的回复,因此每个项目都会有很多回复。)
我推荐这样的设置:
PERSON <---- PERSON_QUESTIONNAIRE ----> QUESTIONNAIRE
^ ^
| |
| |
RESPONSE -----> ITEM
我对如何设置数据库网格(不是Delphi专家)没有任何建议,但有时解决设计问题将有助于技术解决方案变得更加清晰。