哪个数据库表模式用于存储调查数据?

时间:2012-05-08 15:47:06

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

我正在开发用于进行在线调查的软件。当很多用户同时填写调查时,我在处理高数据库写入负载时遇到了麻烦。我当前用于存储调查数据的表(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(值列具有与其表对应的数据类型)。对于一个http帖子,例如20个项目,然后我可能必须在data_tinyint_1中创建19行,在data_text中创建一行(而不是更新一个包含许多列的大行)。但是,对于每个项目,我需要确定其数据类型(通过两个表连接),因此我知道在哪个表中创建新行。使用这种方法,我的基于zend框架的应用程序代码将变得更加复杂。

我的问题:

  1. 我的解决方案对于大量写入负载会更好吗?
  2. 你有更好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

由于您已经开始抽象此模式以模仿实际的数据类型,因此您可能只需要为每个调查创建新的表集。如果负载变得难以承受,那么锁定将会减少并且您可以将重负载隔离到外部机器上。

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

动态创建表没有任何问题。在某些配置中,软分片是首选。

答案 1 :(得分:1)

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