我的数据库技能充其量只是平庸,我必须为调查数据设计一个数据模型。我对此进行了一些思考,现在我觉得我被困在某种EAV 模型和涉及数百个表的设计之间,每个表都有数百列(和数千条记录)。必须有更好的方法来做到这一点,我希望这个论坛上的聪明人能帮助我。
我的问题是:我应该如何在 RDBMS 中对调查问题的答案进行建模?必须使用 SQL Server。因此,应将替代数据存储系统排除在此讨论之外。(当然,有些应该并且将会被评估,但请不要在这里。)我不需要整个数据模型的解决方案,现在我只对答案部分感兴趣。
我已经搜索了各种论坛,但我真的找不到解决方案。如果它已经在其他地方给出,请原谅我并提供一个链接,以便我阅读。
关于我必须处理的数据的一些假设:
- 每个调查由 1 到 n 份问卷组成
- 每份问卷由 100-2,000 个问题组成(请忽略 2,000 个问题听起来确实需要回答很多...)
- 问题可以有多种类型:多项选择、自由文本、数字(如年龄、收入、百分比……)
- 每个调查涉及 10-200 个国家(这些不是受访者。受访者实际上是这些国家的人。)
- 根据问卷的类型,每个问卷由每个国家 100-20,000 名受访者回答。
- 一个国家可以调整调查问卷以进行调查,即添加、删除或编辑问题
- 一个国家的数据收集在该国家的单独数据库中。从一开始就不可能进行在线集成。
- 所有国家的数据都必须在以后整合。这意味着,例如,如果一个国家/地区删除了一个问题,该数据必须以某种方式从他们发送的内容中获取,以便在所有国家/地区实现统一设计
- 我将不得不编写集成和清理软件,它需要处理每个国家的数据
- 最后,需要将数据导出为平面文件、每个国家一个矩形网格和问卷。
我已经与来自不同背景的人讨论过这个话题,但还没有找到好的解决方案。我主要有两种意见。
- 习惯于使用平面文件(电子表格样式)进行数据处理和分析的领域专家投票支持具有大量表和列的非规范化结构,如上所述(每个国家和调查表 1 个表)。这对我来说听起来很糟糕,因为我了解到要避免使用宽表,在使用它时确定表中实际包含哪些列会很烦人,数据库将变得混乱,有数百个表(或者我什至需要设置多个数据库,每个数据库都有相似但有点不同的设计)等。
- OO 程序员投票支持高度“规范化”的设计,这将有效地导致一个包含所有受访者对所有问题的所有答案的中央表。此表需要包含 sql_variant 类型的列或具有不同类型的多个答案列,以存储不同类型的答案(多选、自由文本等)。前者本质上是 EAV 模型。我倾向于在这里关注 Joe Celko,他强烈反对使用它(他称之为 OTLT 或“一个真正的查找表”)。后者意味着每一行将包含设计不适用类型的空单元格。
我能想到的另一种选择是为每种答案类型创建一个表,即一个用于选择题,一个用于自由文本问题等。这不是那么通用,它会导致很多联合连接,我想想如果发明了新的答案类型,我将不得不添加一个表格。
很抱歉让您对所有这些文字感到厌烦,并感谢您的意见!
干杯,亚历克斯
PS:我在这里问了同样的问题:http ://www.eggheadcafe.com/community/aspnet/13/10242616/survey-data-model--how-to-avoid-eav-and-excessive-denormalization.aspx