这个问题与上一个问题Database design for a survey非常相似, 但是,这位提问者没有说明他们处理的数据量,数据的类型以及他们需要做什么,我认为这很重要。
因此,我的任务是为应用程序添加调查功能。该应用程序必须处理50个不同的组织,每个组织将有多达500个调查。 每项调查最多可包含150个问题,并将存储来自真/假,日期等的数据,并一直存储到文本段落。 每项调查最多可回答10,000次。
我看到了设计数据库的三种主要方式来满足这一需求。
问题表:[survey_id,question]等
答案表:[question_id,answer]
每个调查的表格,每个问题都有一个字段
每个客户的数据库......(这是一张同事抛出的外卡,我对此非常怀疑)
虽然我喜欢选项1的想法,但有一些问题。 我们将存储多达380亿行,答案字段必须是文本字段,因此查询事物并按日期排序,例如,将会非常缓慢。该应用程序将实现实时报告。
考虑到数据和报告要求的数量,我觉得有必要考虑动态创建表,一旦创建数据,由于正在使用的字段,如果需要更改,则所有数据都会被废弃并重新启动,因此数据不会发生变化,所以我不担心必须在调查中进行架构更新。 我看到的主要问题是表的数量25,000个表似乎非常多,我不确定这是否比查询380亿行错误结构化数据更好...或者即使有严格的限制我很可能会受到打击。这里的优点是我们可以100%确定不会有任何表格连接,并且不可能在任何一天评估超过500个不同的表格。
这给我们带来了选项三,这是由同事提出的,我不确定MySql(客户端当前使用的数据库)的内部工作,但我不认为将它拆分为多个数据库会使在同一台服务器上有多少差异?说过我有能力使用我想要的任何数据库。
在这种情况下,最好的方法是什么?我没有考虑过第四种选择吗?
答案 0 :(得分:0)
您可以将段落文本答案保存在单独的表中,因为它们与其他具有微小值的问题类型具有不同的性质。您需要一个问题类型(或答案类型?)字段。
如果这些问题在客户和调查中是完全独特的,或者他们只是重复了类似的问题"有不同的价值观。如果它是后者,那么问题的产生可以变得动态。
每个调查的结果('表格),('每个问题的字段')和('每个客户的数据库')看起来太多不正常的我。调查问题链接表应该这样做。同样,您可以拥有一个Clients表并拥有一个客户调查链接表。
实时报告所需的数据项可以保存在为汇总信息单独设计的其他表中。当然,如果更新摘要表后问题 - 答案值发生更改,则必须重新更新它们以反映更改的摘要值。
这样你就不会遇到任何硬限制。通过为报告元素或计数添加其他表,可以优化数据库以进行实时报告。或者你可以只有一个数据库,一个类似EIS的数据库,用于实时报告,这样交易更新不会阻碍报告,反之亦然。
我很清楚这个答案来自于#normal; normalized仍然可以很好地运作的思维。对于这种情况,我不知道为什么不这样做。
答案 1 :(得分:0)
因此,假设您最关心的是性能,并且您实际上知道应该使用option #1
来使用哪种类型的数据,但需要使用其他专用列。
将所有答案保存在一个通用列中的一个表中,但添加特定于每种类型的其他列,例如。 a_date
,a_bool
。仅填充常规列和具有此答案应该是的数据类型的列。类型数量非常有限,您可以在每个类型上设置索引并利用它们的类型。它的优点还在于您存储有关答案类型的信息,因此您可以轻松地仅关注特定答案类型,例如。可用于报告的日期。
您还可以完全分离表格中的类型,而不是将所有答案都放在一个通用列中,而不是每种类型的其他类型,您可以只有一个用于文本,一个用于日期等等。这样,您就能够在一个步骤中解决开放(文本)答案并减少数据冗余。
奖金:为了提高性能,我还会研究数据库分区,例如。使用每个客户端(假设报告将是每个客户端)。