调查数据模型 - 如何避免EAV和过度非规范化?

时间:2011-01-07 15:16:54

标签: sql database-design survey

我的数据库技能充其量是平庸的,我必须为调查数据设计数据模型。我已经对此有了一些想法,现在我觉得我陷入了某种EAV model和涉及数百个表的设计之间,每个表都有数百个列(以及数千个记录)。必须有一个更好的方法来做到这一点,我希望这个论坛上的聪明人可以帮助我。

我的问题是:我应该如何在RDBMS中对调查问题的答案进行建模?使用SQL Server是必需的。因此,应该从讨论中排除替代数据存储系统。 (当然,有些应该并且将会被评估,但请不要在这里。)我不需要整个数据模型的解决方案,现在我只对Answers部分感兴趣。

我已经搜索了各种论坛,但我找不到真正的解决方案。如果已经在其他地方给过,请原谅我并提供一个链接,以便我可以阅读。

关于我必须处理的数据的一些假设:

  1. 每项调查由1至n份问卷组成
  2. 每份问卷包含100-2,000个问题(请忽略2000个问题,听起来真的很多......)
  3. 问题可以是各种类型:多项选择,自由文本,数字(如年龄,收入,百分比......)
  4. 每项调查涉及10-200个国家(这些国家不是受访者。受访者实际上是这些国家的人。)
  5. 根据调查问卷的类型,每个调查问卷由每个国家的100-20,000名受访者回答。
  6. 国家/地区可以调整调查问卷,即添加,删除或编辑问题
  7. 一个国家/地区的数据收集在该国家/地区的单独数据库中。从一开始就没有在线整合的可能性。
  8. 以后必须整合所有国家/地区的数据。这意味着,例如,如果一个国家/地区删除了一个问题,那么该数据必须以某种方式从他们发送的内容中获得,以便在所有国家/地区实现统一设计
  9. 我必须编写集成和清理软件,它需要处理每个国家/地区的数据
    1. 最后,数据需要导出到平面文件,每个国家/地区一个矩形网格和问卷。
  10. 我已经与不同背景的人讨论了这个话题,但还没有找到一个好的解决方案。我主要有两种意见。

    1. 领域专家,习惯于使用平面文件(电子表格式)进行数据处理和分析,投票支持非正规化结构,其中包含大量表格和列,如上所述(每个国家和调查表1张表)。这对我来说听起来很糟糕,因为我了解到要避免使用宽表,在使用它时确定哪些列实际位于表中会很烦人,数据库将变得混乱数百个表(或者我甚至需要设置多个数据库,每个数据库都有类似但有点不同的设计)等等。
    2. O-O程序员投票支持强烈的“规范化”设计,这将有效地形成一个中心表,其中包含所有问题的所有答复者的所有答案。此表要么需要包含sql_variant类型的列,要么包含具有不同类型的多个答案列以存储不同类型的答案(多选,自由文本,...)。前者基本上是一个EAV模型。我倾向于关注Joe Celko,他强烈反对使用它(他称之为OTLT或“One True Lookup Table”)。后者意味着每行在设计时都会包含不适用类型的空单元格。
    3. 我能想到的另一个选择是为每个答案类型创建一个表,即一个用于多项选择题,一个用于自由文本问题等。这不是那么通用,它会导致很多联合加入,我认为如果发明了一种新的答案类型,我将不得不添加一个表。

      很抱歉对所有这些文字感到厌烦,感谢您的投入!

      干杯, 亚历

      PS:我在这里问了同样的问题:http://www.eggheadcafe.com/community/aspnet/13/10242616/survey-data-model--how-to-avoid-eav-and-excessive-denormalization.aspx

4 个答案:

答案 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 可选问题的列 包括那些被添加的

如果您不熟练粉碎XML,那么请对所有可选问题使用稀疏列。我不记得表格中稀疏列数的限制,但我相信它超过30,000。 SQL Server在内部将稀疏列存储为XML,并在选择列时将其粉碎,是的,可以将其编入索引

下图显示了使用SQL Server创建的图表。 AL_A4列将保留QL_Id = 4的答案,并且类型为稀疏。 QuestionList表中的QL_Id没有标记为必需,让您知道如何使AnswerList中的列稀疏。

由于各国将添加问题,请创建QuestionListCustom,QuestiontoCountryCustom和AnswerListCustom表,并添加自定义问题的信息。

我相信还有其他方法可以设计存储空间,这就是我在家庭作业中的转变方式,如果这不是作业,那么你肯定会为联合国工作。

alt text

答案 3 :(得分:-1)

您是否考虑过不重新发明轮子?已经建立了开源调查应用程序。即使它们不能满足您的需求,也请下载一些并查看其数据模型。