数据库devise的调查
我需要创build一个调查答案存储在数据库中。 我只是想知道什么是最好的方式来实现这个数据库,特别是所需的表。 调查包含不同types的问题。 例如:评论的文本字段,多选题,以及可能包含多个答案的问题(即检查所有适用的问题)。
我提出了两个可能的解决scheme:
-
创build一个巨大的表,其中包含每个调查提交的答案。 每列将对应于调查的答案。 即SurveyID,Answer1,Answer2,Answer3
我认为这不是最好的方法,因为在这次调查中有很多问题,如果调查要改变,似乎不是很灵活。
-
另一件我想到的是创build一个问题表和答案表。 问题表将包含调查的所有问题。 答案表将包含来自调查的个别答案,每一行都链接到一个问题。
一个简单的例子:
tblSurvey :SurveyID
问题 :QuestionID, SurveyID ,QuestionType,问题
tblAnswer :AnswerID, UserID , QuestionID ,答案
tblUser :UserID,UserName
我的问题是,可能有大量的答案,这将使答案表非常庞大。 在性能方面,我不太确定。
我会很感激任何想法和build议。
我认为你的模型#2是好的,但你可以看看更复杂的模型存储的问题和预先的答案(提供的答案),并允许他们在不同的调查中重新使用。
– 一项调查可以有很多问题; 一个问题可以(重新)在许多调查中使用。
– 一个(预先制定的)答案可以提供许多问题。 一个问题可以有很多答案。 一个问题可以在不同的调查中提供不同的答案。 在不同的调查中可以回答不同的问题。 有一个默认的“其他”的答案,如果一个人select其他,她的答案被logging到Answer.OtherText。
– 一个人可以参加很多调查,一个人只能在一次调查中回答具体问题一次。
我的devise如下所示。
最新的创build脚本在https://gist.github.com/durrantm/1e618164fd4acf91e372
脚本和mysql workbench.mwb文件也可以在
https://github.com/durrantm/survey
绝对的选项#2,我也认为你可能在当前模式有一个疏忽,你可能需要另一个表:
+-----------+ | tblSurvey | |-----------| | SurveyId | +-----------+ +--------------+ | tblQuestion | |--------------| | QuestionID | | SurveyID | | QuestionType | | Question | +--------------+ +--------------+ | tblAnswer | |--------------| | AnswerID | | QuestionID | | Answer | +--------------+ +------------------+ | tblUsersAnswer | |------------------| | UserAnswerID | | AnswerID | | UserID | | Response | +------------------+ +-----------+ | tblUser | |-----------| | UserID | | UserName | +-----------+
每个问题可能会有一组答案,用户可以从中select,然后实际的答案将在另一个表中进行跟踪。
数据库旨在存储大量的数据,而且大部分数据量都非常好。 为了节省空间,没有必要使用更简单的forms 。
一般来说,基于用户可能改变的东西(例如向调查添加问题)修改模式应该被认为是相当臭的。 在某些情况下,可以适当的做,尤其是在处理大量数据时,在进行深入分析之前知道进入的内容。每个调查只有一个“响应”表意味着添加或删除问题可能会非常昂贵,而且以与问题无关的方式进行分析非常困难。
我认为你的第二种方法是最好的,但是如果你确定你会有很多的规模问题,过去有一件事对我来说是一个混合的方法:
- 创build详细的响应表来存储每个问题的响应,如您在2中所描述的。通常不会直接从您的应用程序中查询这些数据,而是将用于生成报告表的摘要数据。 你可能也想实现某种forms的归档或删除这些数据。
- 如有必要,也从1创build响应表。 只要用户想查看简单的结果表,就可以使用它。
- 对于需要进行报告的任何分析,安排作业以根据来自1的数据创build额外的摘要数据。
这绝对是要执行更多的工作,所以我真的不会build议,除非你确定地知道这张桌子将会遇到大规模的问题。
第二种方法是最好的。
如果你想进一步规范化,你可以创build一个问题types的表
简单的事情是:
- 放置数据库并login到自己的磁盘上,而不是全部在C上
- 根据需要创build数据库,以便在数据库增长时不会有暂停
我们在SQL Server表中有10万行的日志表。
没有2看起来不错。
对于只有4列的表格,即使有好几百万行也不成问题。 当然这可以取决于你使用的数据库。 如果它的东西像SQL Server那么这将是没有问题的。
您可能需要在tblAnswer表的QuestionID字段上创build一个索引。
当然,你需要指定你正在使用的数据库以及估计的数据量。
看起来相当完整的一个smiple调查。 不要忘记添加一个“开放价值”的表格,客户可以通过文本框提供他的意见。 将该表与外键链接到您的答案,并在所有关系列上放置索引以提高性能。
2号是正确的。 除非检测到性能问题,否则请使用正确的devise。 大多数关系型数据库不会有一个狭窄但很长的表格的问题。
有一个大的答案表,本身,不是一个问题。 只要指标和约束条件明确,你就应该没问题。 你的第二个模式对我来说很好。
鉴于适当的索引,你的第二个解决scheme是规范化的,对传统的关系数据库系统来说是好的。
我不知道这是多么的巨大,但它应该没有问题的几百万答案。
您可以select将整个表单存储为JSONstring。
不确定您的要求,但是这种方法在某些情况下会起作用。