我正在使用PDO/MySQL和PHP为我的大学的一位教授建立一个调查系统。我有一个问题表,该表包含大量信息,包括question_id、question、enabled和order。创建调查时,enabled = 1所在的所有question_id都被压缩为一个字符串,并存储在一个单独的survey表中。将来编辑问题时,系统只会禁用旧问题,并将新版本添加到表格的末尾,并使用适当的order值更新所有内容,从而允许仍以原始状态查看旧调查。
我正在努力弄清楚如何最好地处理这方面的排序问题。如果我在数据库中为索引存储了一个字符串(例如,我的字符串将是2,3,5,6,9,4,1),那么我可以很容易地显示输出数据--我可以使用explode(),然后迭代该数组的默认0索引,依次调用每个问题。如何以正确的顺序存储值?
发布于 2013-01-25 03:15:48
通过内爆成一个字符串,你就是在反规范化你的数据。我建议不要这样做,尤其是在这种情况下。使用单独的表来管理问题和调查之间的链接。
我发现这有点奇怪,因为我还没有完全理解你想要做什么。我认为你正在创建一个单一的在线调查-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-25 02:59:53
只要摆脱"all question_ids are imploded into a string and stored in a separate survey table"部件,因为它是无用的和错误的。
因此,每次您需要您的问题ids顺序-只需从问题表中选择它们,按order字段排序。
不要无缘无故地把事情复杂化。你会让你的生活变得更轻松。
一个真正的原因,我是说,不是想象中的原因。
当涉及到数据库设计时,这样的规则可以用一条定律的形式来表述:Always keep your database in a Normal form
我希望你有另外一个表,由user id,question id和an answer组成。
https://stackoverflow.com/questions/14508608
复制相似问题