这个问题非常类似于前一个调查的问题数据库设计,但是,这个提问者没有具体说明他们处理的数据量、数据类型以及他们需要做什么,我认为这非常重要。
所以我的任务是在应用程序中添加一个调查功能。申请必须处理50个不同的组织,每个组织将有多达500个调查。每项调查将有多达150个问题,并将存储从真/假,日期等数据,一直到文本段落。每项调查将得到多达10000次的答复。
我看到了三种主要的数据库设计方法来满足这个需求。
一张table可以放所有的问题,另一张table可以放所有的答案。
问题表:[survey\u id,question]等
答案表:[问题id,答案]
每个调查都有一个表,每个问题都有一个字段
每个客户端的数据库(这是同事抛出的外卡,对此我非常怀疑)
虽然我喜欢选项1的想法,但也有一些问题。我们将存储多达380亿行,答案字段必须是文本字段,因此查询内容和按日期排序(例如)将非常缓慢。这个应用程序需要实时报告。
考虑到数据量和报告要求,我觉得有必要考虑动态地创建表,一旦创建了表,数据就不会因为它所使用的字段而发生更改如果需要更改,所有内容都会被废弃并重新开始,所以我不担心必须在调查期间进行模式更新。我看到的主要问题是表的数量25000个表看起来太多了,我不确定这是否比查询380亿行结构不正确的数据要好。。或者即使有我可能达到的严格限制。这里的一个好处是,我们可以100%确定不会有任何表联接,而且不太可能在任何一天评估超过500个不同的表。
这让我们想到了选项三,这是一位同事提出的,我不确定mysql(客户端当前使用的数据库)的内部工作,但我不认为将其拆分为多个数据库会在同一台服务器上产生多大/任何差异?我已经说过,我有能力使用任何数据库,我希望。
在这种情况下,最好的方法是什么?有没有第四种我没有考虑的方法?
2条答案
按热度按时间cwdobuhd1#
您可以将段落文本答案保存在一个单独的表中,因为它们不同于其他具有微小值的问题类型。您需要一个问题类型(或答案类型?)字段。
如果这些问题在客户和调查中是完全独特的,或者它们仅仅是具有不同价值观的“相似问题”的重复。如果是后者,问题的产生可以变得动态。
想法(‘每个调查的表格’)、(‘每个问题的字段’)和(‘每个客户的数据库’)在我看来太不规范了。一个调查问题链接表应该做。类似地,您可以有一个clients表和一个clientsurvey链接表。
实时报告所需的数据项可以保存在为汇总信息而单独设计的其他表中。当然,如果问题答案值在摘要表更新后发生更改,则必须重新更新它们以反映更改的摘要值。
这样你就不会达到任何严格的限制。数据库可以为实时报告而优化,只需为报告元素或计数提供额外的表。或者您可以只需要一个数据库,一个类似eis的数据库,用于实时报告,这样事务更新就不会妨碍报告,反之亦然。
我很清楚,这个答案来自于“标准化仍然可以很好地工作”的想法,对于这种情况,我看不出有什么理由不这样做。
0vvn1miw2#
所以假设您最关心的是性能,并且您确实知道什么类型的数据应该是我的答案
option #1
但有额外的专门专栏。将所有答案保留在一个表中的一个常规列中,但为每种类型添加特定的附加列。
a_date
,a_bool
. 只填写“常规”列,并在列中填写此答案应包含的数据类型。类型的数量非常有限,您可以在每个类型上设置索引并利用它们的类型。它的优点还在于,您可以存储有关答案类型的信息,这样您就可以轻松地只关注特定的答案类型,例如,对报告有用的日期。您还可以在表中完全分离类型,而不是将所有答案都放在一个常规列中,并为每个类型添加其他答案,您可以只使用一个用于文本,一个用于日期等等。通过这种方式,您应该能够在一个步骤中解决开放(文本)答案并减少数据冗余。
额外好处:为了提高性能,我还将研究数据库分区,例如使用每个客户机(假设每个客户机都有报告)。