mysql - 测量样式应用程序的数据库结构

标签 mysql database

这个问题与上一个问题非常相似Database design for a survey , 然而,这个提问者没有具体说明他们正在处理的数据量、数据类型以及他们需要用它做什么,我认为这很重要。

因此,我的任务是向应用程序添加调查功能。该应用程序必须处理 50 个不同的组织,每个组织将有多达 500 个调查。 每项调查将有多达 150 个问题,并将存储从真/假、日期等一直到文本段落的数据。 每项调查将最多回答 10,000 次。

我看到了三种主要的数据库设计方式来满足这一需求。

  1. 一个表用于所有问题,另一个表用于所有答案,即。

问题表:[ survey_id, question ] 等

答案表:[question_id, answer]

  1. 每个调查的表格,每个问题都有一个字段

  2. 每个客户的数据库...(这是同事抛出的一个外卡,我对此非常怀疑)

虽然我喜欢选项 1 的想法,但也存在一些问题。 我们将存储多达 380 亿行,答案字段必须是文本字段,因此查询内容和按日期排序等操作会非常慢。此应用程序预计会提供实时报告。

考虑到数据量和报告要求,我觉得有必要考虑动态创建表格,数据一旦创建就不会更改,因为如果需要更改,则所有内容都将被废弃并重新开始,所以我不担心必须在调查中进行架构更新。 我看到的主要问题是表的数量 25,000 个表似乎很多,我不确定这是否比查询 380 亿行结构不正确的数据更好..或者即使有硬限制我很可能击中。这里的一个好处是我们可以 100% 确定不会有任何表连接,而且一天内评估的不同表的可能性不会超过 500 个。

这将我们带到选项三,这是一位同事提出的,我不确定 MySql(客户端当前使用的数据库)的内部工作,但我认为将其拆分为多个数据库不会同一台服务器上有很多/任何差异吗?话虽如此,我确实有能力使用我想要的任何数据库。

在这种情况下最好的方法是什么?还有第四种我没有考虑过的选择吗?

最佳答案

因此,假设您最关心的是性能,并且您确实知道什么类型的数据应该是答案,我会选择选项 #1,但会使用额外的专门列。

将所有答案保留在一个表格中的一个通用列中,但添加特定于每种类型的附加列,例如。 a_date, a_bool。仅填写一般列和该答案应包含的数据类型的列。类型的数量非常有限,您将能够为它们中的每一个设置索引并利用它们的类型。它的优点还在于您可以存储有关答案类型的信息,因此您可以轻松地只关注特定的答案类型,例如。可用于报告的日期。

您还可以完全分隔表格中的类型,而不是将所有答案都放在一个通用列中,每个类型都有其他答案,您可以只用一个用于文本,一个用于日期等等。这样一来,您应该能够一步解决开放式(文本)答案并减少数据冗余。

奖励:为了提高性能,我还会研究数据库分区,例如。使用每个客户(假设报告将针对每个客户)。

关于mysql - 测量样式应用程序的数据库结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48137785/

相关文章:

ruby-on-rails - Rails 控制台 : Does rails console maintain cache for database tables? 如何禁用它?

mysql - 我是否正确计算了 MySQL 数据库的最大连接限制?

php - 如何在 Laravel 之外使用 Eloquent 创建表查询?

从两个相关表中获取数据的sql查询

java - 检查和比较 Java 数据库中的数据(时间限制)的好方法是什么?

sql - 如何更新所选数据库中所有过程中公共(public)参数的数据类型

mysql - 对MySQL结果进行排序,使两列中任意一列具有特定值的结果最后显示

mysql - 不同的值作为另一列中的字符串

mysql - 为什么这个触发器使更新如此缓慢?

java - 无需安装任何软件即可在局域网上通信两个html页面