0

我正在使用 PDO/MySQL 和 PHP 为我大学的一位教授构建一个调查系统。我有一张问题表,该表中有大量信息,包括question_idquestionenabledorder。创建调查时,所有question_ids whereenabled = 1都被内爆成一个字符串并存储在一个单独的survey表中。将来编辑问题时,系统将简单地禁用旧问题并将新版本添加到表的末尾,并使用适当的值更新所有内容order,从而允许仍以原始状态查看旧调查。

我正在努力弄清楚如何最好地处理这方面的订购方面。如果我在question_ids 的数据库中存储了一个字符串(例如,我的字符串是2,3,5,6,9,4,1),我可以轻松显示输出数据——我可以使用explode()然后遍历该数组的默认 0 索引,调用每个问题转动。如何以正确的顺序存储值?

4

2 回答 2

1

通过内爆成一个字符串,你正在非规范化你的数据。我建议不要这样做,尤其是在这种情况下。使用单独的表格来管理问题和调查之间的联系。

我觉得这有点奇怪,因为我还没有完全理解你想要做什么。我认为您正在创建一个在线调查 - 一个具有单一目的的调查,而不是创建许多不相关调查的工具。所以如果我的假设是正确的,我会做更多的表

TABLE Surveys (
SurveyId INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
SurveyTitle VARCHAR(100) NOT NULL,
SurveyDescription TEXT,
Owner VARCHAR(100),
BLAH BLAH BLAH
);

TABLE Questions (
QuestionId INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
Version INT UNSIGNED NOT NULL,
Question TEXT,
OrderNumber INT UNSIGNED,
Enabled ENUM('Yes', 'No') DEFAULT 'Yes'
);

TABLE SurveyQuestions (
SQId INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
SurveyId INT UNSIGNED NOT NULL,
QuestionId INT UNSIGNED NOT NULL,
Version INT UNSIGNED NOT NULL
);

TABLE QuestionHistory (
QuestionId INT UNSIGNED,  // notice we dont have a primary key i would probably do a composite key on QuestionId and Version
Version INT UNSIGNED NOT NULL,
Question TEXT,
OrderNumber INT UNSIGNED,
Enabled ENUM('Yes', 'No') DEFAULT 'Yes',
DateSuperceded DATETIME
);

您还需要一个用于调查对象及其回复的表格,回复可能应该链接到 SurveyQuestions 表格。最好在问题历史记录表上使用自动 ID - 但这取决于您到底想做什么。

这是一个比我想发布的更长的答案。如果我混淆了这个问题而不是澄清了,我深表歉意。如果您想发布您正在尝试创建的更详细的规范,那么我可以提供更好的建议。

于 2013-01-24T19:15:48.433 回答
0

只是摆脱"all question_ids are imploded into a string and stored in a separate survey table"部分,因为它是无用和错误的。

因此,每次您需要按顺序排列问题 ID 时 - 只需从问题表中选择它们,按order字段排序即可。

不要无缘无故地把事情复杂化。你会让你的生活更轻松。
我的意思是一个真正的原因,不可想象的一个。
当涉及到数据库设计时,这样的规则可以用一种规律的形式来表述:始终保持你的数据库处于 Normal 形式

我希望你有另一个表的结果,由user idquestion id组成an answer

于 2013-01-24T18:59:52.700 回答