我正在使用PDO / MySQL和PHP为我大学的教授建立一个调查系统。我有一个问题表,该表中包含大量信息,包括question_id
,question
,enabled
和order
。创建调查时,question_id
所有enabled = 1
都会被列入字符串并存储在单独的survey
表中。在将来编辑问题时,系统将简单地禁用旧问题并将新版本添加到表格的末尾,并使用order
的正确值更新所有内容,从而允许在旧版调查中查看他们原来的状态。
我正在努力弄清楚如何最好地处理这方面的订购方面。如果我在question_id
的数据库中存储了一个字符串(例如,我的字符串将是2,3,5,6,9,4,1
),我可以轻松地显示输出数据 - 我可以使用explode()
然后迭代该数组的默认0索引,依次调用每个问题。如何以正确的顺序存储值?
答案 0 :(得分: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 - 但这取决于您想要做什么。
这是一个比我想发布的答案要长得多的答案。道歉,如果我把这个问题弄糊涂了。如果你想发布你想要创建的更详细的规范,那么我可以给出更好的建议。
答案 1 :(得分:0)
摆脱"all question_ids are imploded into a string and stored in a separate survey table"
部分,因为它没用,也没错。
因此,每当您需要按顺序排列问题ID时 - 只需在问题表中选择它们,按order
字段排序。
不要没有理由使事情复杂化。你会让生活变得更轻松 我的意思是一个真正的原因,而不是想象中的原因 在数据库设计方面,这样的规则可以用法律的形式制定:Always keep your database in a Normal form
我希望您拥有另一张表的结果包含user id
,question id
和an answer
。