【问题标题】:Which database table schema for storing survey data?哪个数据库表架构用于存储调查数据?
【发布时间】:2012-05-08 15:47:06
【问题描述】:

我正在开发用于进行在线调查的软件。当许多用户同时填写调查时,我在处理高数据库写入负载时遇到了麻烦。我当前用于存储调查数据的表(MySQL、InnoDB)具有以下列:dataID、userID、item_1 .. item_n。 item_* 列具有不同的数据类型,对应于使用特定项目获取的数据类型。大多数项目列是 TINYINT(1),但也有一些 TEXT 项目列。大型调查可以有一百多个项目,导致一个包含一百多个列的表。用户在一篇 http 帖子中回答了大约 20 个项目,相应的行必须相应更新。用户可能会跳过很多项,导致行中有很多 NULL 值。

我正在考虑以下解决方案来解决我的写入负载问题。我没有使用包含许多列的单个表,而是设置了与使用的数据类型相对应的几个表,例如:data_tinyint_1、data_smallint_6、data_text。这些表中的每一个都只有以下列:userID、itemID、value(value 列具有与其表对应的数据类型)。对于一个 http 帖子,例如20 项,然后我可能必须在 data_tinyint_1 中创建 19 行,在 data_text 中创建 1 行(而不是更新包含许多列的大行)。但是,对于每个项目,我需要确定它的数据类型(通过两个表连接),以便我知道在哪个表中创建新行。使用这种方法,我的基于 zend 框架的应用程序代码会变得更加复杂。

我的问题:

  1. 对于繁重的写入负载,我的解决方案会更好吗?
  2. 您有更好的解决方案吗?

【问题讨论】:

  • 我认为这更像是一种微优化。现实情况是,您可能需要在问题上投入更多硬件。这是托管在共享主机上吗?您可能需要一个专用服务器和一个load-balanced mysql cluster
  • 我希望您会在数据库之前遇到 Web 服务器负载问题。
  • @SamDufel 你能多说一点吗?
  • @Wunibald 您是在猜测“重载”的真正含义,还是在您的平台上实际测量过它?即使是一个普通的 SQL 服务器也可以处理大多数人认为的“重负载”,但我们无法判断您是每分钟插入 100 条记录(这没什么)还是每秒插入 10,000 条记录(这更有趣)
  • @cilosis 该应用程序托管在虚拟专用服务器 ([servergrove.com/vps](ServerGrove VPS700)) 上。您可能是对的,专用服务器可以解决问题。

标签: php mysql database zend-framework server-load


【解决方案1】:

由于您已经到了抽象此模式以模拟实际数据类型的地步,因此您应该简单地为每个调查创建新的表集。好处是锁定会减轻,如果负载变得难以承受,您可以将重负载隔离到外部机器。

单一调查数据库结构可以更准确地反映您的真实世界条件和数据输入处理程序。它应该会让你的抽象问题消失。

动态创建表格并没有错。在某些配置中,软分片更可取。

【讨论】:

  • 如果列数仍如 Wunibald 所描述的那样高,是否会为每个调查创建新表集?
  • 我相信是这样的:通过将其重新设计到不进行连接抽象查找的地方(什么数据类型是字段?),性能将会提高。 OP 提到了“data_tinyint_1 中的 19 行”,这将减少为 1 次查找(例如:描述表survey_3343)
【解决方案2】:

这看起来很明显的解决方案是使用文档数据库进行快速写入,然后使用 cron 或类似的东西异步批量插入 MySQL 的答案。您可以在文档数据库中创建视图以进行快速统计,但如果您不喜欢文档 DBMS,则只能在 MySQ 中进行过滤和其他复杂的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    相关资源
    最近更新 更多