小编Ale*_*DPC的帖子

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

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

我的问题是:我应该如何在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. 最后,数据需要导出到平面文件,每个国家一个矩形网格和问卷.

我已经与不同背景的人讨论了这个话题,但还没有找到一个好的解决方案.我主要有两种意见.

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

我能想到的另一个选择是每个答案类型创建一个表,即一个用于多项选择题,一个用于自由文本问题等.这不是那么通用,它会导致很多联合,我想想,如果发明了新的答案类型,我将不得不添加一个表格.

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

干杯,亚历克斯

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

sql database-design survey

8
推荐指数
1
解决办法
4774
查看次数

SQL Query用于计算一行中值的出现次数

请参阅以下示例表.我想计算每一行的1.对于第一行,N_1必须是3,对于第二行,然后是1,然后是0.最后,我想将其合并到具有参数Table,Columns,Value的存储过程中.

CREATE TABLE Have 
( Col1 INT NOT NULL
, Col2 INT NOT NULL
, Col3 INT NOT NULL
, N_1 INT NULL 
)
INSERT Have (Col1, Col2, Col3)
    VALUES
     (1, 1, 1)
    ,(1, 1, 2)
    ,(1, 2, 2) 
    ,(2, 2, 2)
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server-2008

2
推荐指数
1
解决办法
1120
查看次数

标签 统计

sql ×2

database-design ×1

sql-server-2008 ×1

survey ×1

t-sql ×1