我的数据库技能充其量是平庸的,我必须为调查数据设计数据模型。我已经对此有了一些想法,现在我觉得我陷入了某种EAV model和涉及数百个表的设计之间,每个表都有数百个列(以及数千个记录)。必须有一个更好的方法来做到这一点,我希望这个论坛上的聪明人可以帮助我。
我的问题是:我应该如何在RDBMS中对调查问题的答案进行建模?使用SQL Server是必需的。因此,应该从讨论中排除替代数据存储系统。 (当然,有些应该并且将会被评估,但请不要在这里。)我不需要整个数据模型的解决方案,现在我只对Answers部分感兴趣。
我已经搜索了各种论坛,但我找不到真正的解决方案。如果已经在其他地方给过,请原谅我并提供一个链接,以便我可以阅读。
关于我必须处理的数据的一些假设:
我已经与不同背景的人讨论了这个话题,但还没有找到一个好的解决方案。我主要有两种意见。
我能想到的另一个选择是为每个答案类型创建一个表,即一个用于多项选择题,一个用于自由文本问题等。这不是那么通用,它会导致很多联合加入,我认为如果发明了一种新的答案类型,我将不得不添加一个表。
很抱歉对所有这些文字感到厌烦,感谢您的投入!
干杯, 亚历
PS:我在这里问了同样的问题:http://www.eggheadcafe.com/community/aspnet/13/10242616/survey-data-model--how-to-avoid-eav-and-excessive-denormalization.aspx
答案 0 :(得分:4)
答案 1 :(得分:1)
这听起来像是在解决一个常见的问题:如何用锤子拧紧螺丝。
您列出的两种替代品都不好,每种都有不同的原因。但那是因为你试图将你的特定数据模型填充到关系数据库系统中。一个好的方法是超越some other database/storage systems的关系数据库,尝试一下,找到最适合你项目的。
我尝试了EAV模型并放弃了,因为它太复杂了,我害怕尝试使用关系数据库系统的多表模型。我在关系数据库中找到的最简单的解决方案是:将每个完整响应存储为单个CLOB,在responses
表中序列化为JSON或YAML(或其他轻量级)。
create table responses (
id uuid primary key,
questionnaire_id uuid references questionnaires.id,
data text
)
答案 2 :(得分:1)
如果我使用的是SQL Server,Express会没问题,那么我会这样做:
如果您不熟练粉碎XML,那么请对所有可选问题使用稀疏列。我不记得表格中稀疏列数的限制,但我相信它超过30,000。 SQL Server在内部将稀疏列存储为XML,并在选择列时将其粉碎,是的,可以将其编入索引
下图显示了使用SQL Server创建的图表。 AL_A4列将保留QL_Id = 4的答案,并且类型为稀疏。 QuestionList表中的QL_Id没有标记为必需,让您知道如何使AnswerList中的列稀疏。
由于各国将添加问题,请创建QuestionListCustom,QuestiontoCountryCustom和AnswerListCustom表,并添加自定义问题的信息。
我相信还有其他方法可以设计存储空间,这就是我在家庭作业中的转变方式,如果这不是作业,那么你肯定会为联合国工作。
答案 3 :(得分:-1)
您是否考虑过不重新发明轮子?已经建立了开源调查应用程序。即使它们不能满足您的需求,也请下载一些并查看其数据模型。