我们的应用程序将为每个用户创建动态表单。
我们正在考虑两种方法:
a) 我们将所有用户表单数据存储在单个表中,作为键值对。然后使用 pivot table technique 技术获取数据并进行过滤,这种方法有效,但可能会消耗大量资源。
b) 为每个用户创建适合其设计的表格/设计表格,这样我们就不必进行数据透视,并且可以获得 MySQL 的所有优点,而且我们不需要连接超过几个表。
我们主要关注可扩展性,在情况 'a' 中,如果表格变得非常庞大(即使只考虑1000个用户注册),在计划 'b' 中,如果明天我们的表格随着流量增长而增长,我们可能需要使用 MySQL 集群,但是根据我在此处阅读到的内容,集群有表格限制 http://dev.mysql.com/doc/refman/5.0/en/mysql-cluster-limitations-database-objects.html。 更新 一种新的想法浮现在我们脑海中,为什么不创建一个适合单个表单元素(文本字段,文本区域等)的单个表格(作为键,值),使用基于用户创建的表单定义的连接(连接数=字段数),我们可以创建水平数据,而不需要进行数据透视。您认为这个想法怎么样。
更新于2011年4月9日
我们对比了透视和连接
场景-我们有一个包含7个字段的表单,数据存储为(单个表单插入的示例数据)
对于透视查询,将70000行数据透视为10000个表单插入需要0.92秒。 对于连接,展示这10000个表单插入需要17.63秒(哇.....)。
我的表格
创建表格,如果不存在则创建名为“兽医”的表格,包括以下列:id(整数类型,不为空),form_id(整数类型,不为空),key(varchar类型,长度为255,不为空),value(varchar类型,长度为255,不为空),其中id和form_id各自有一个索引。使用的引擎为MyISAM,字符集为latin1。
旋转查询
选择id,使用GROUP_CONCAT函数将k1、k2、k3、k4、k5、k6、k7的值分别合并到'key1'、'key2'、'key3'、'key4'、'key5'、'key6'、'key7'中,并且只有当'key'等于对应的k值时才会使用该函数。从vet表格中选取数据,其中form_id等于2,然后按照id进行分组。
连接查询
我们正在考虑两种方法:
a) 我们将所有用户表单数据存储在单个表中,作为键值对。然后使用 pivot table technique 技术获取数据并进行过滤,这种方法有效,但可能会消耗大量资源。
b) 为每个用户创建适合其设计的表格/设计表格,这样我们就不必进行数据透视,并且可以获得 MySQL 的所有优点,而且我们不需要连接超过几个表。
我们主要关注可扩展性,在情况 'a' 中,如果表格变得非常庞大(即使只考虑1000个用户注册),在计划 'b' 中,如果明天我们的表格随着流量增长而增长,我们可能需要使用 MySQL 集群,但是根据我在此处阅读到的内容,集群有表格限制 http://dev.mysql.com/doc/refman/5.0/en/mysql-cluster-limitations-database-objects.html。 更新 一种新的想法浮现在我们脑海中,为什么不创建一个适合单个表单元素(文本字段,文本区域等)的单个表格(作为键,值),使用基于用户创建的表单定义的连接(连接数=字段数),我们可以创建水平数据,而不需要进行数据透视。您认为这个想法怎么样。
更新于2011年4月9日
我们对比了透视和连接
场景-我们有一个包含7个字段的表单,数据存储为(单个表单插入的示例数据)
对于透视查询,将70000行数据透视为10000个表单插入需要0.92秒。 对于连接,展示这10000个表单插入需要17.63秒(哇.....)。
我的表格
创建表格,如果不存在则创建名为“兽医”的表格,包括以下列:id(整数类型,不为空),form_id(整数类型,不为空),key(varchar类型,长度为255,不为空),value(varchar类型,长度为255,不为空),其中id和form_id各自有一个索引。使用的引擎为MyISAM,字符集为latin1。
旋转查询
选择id,使用GROUP_CONCAT函数将k1、k2、k3、k4、k5、k6、k7的值分别合并到'key1'、'key2'、'key3'、'key4'、'key5'、'key6'、'key7'中,并且只有当'key'等于对应的k值时才会使用该函数。从vet表格中选取数据,其中form_id等于2,然后按照id进行分组。
连接查询
SELECT v.id, v1.value as key1, v2.value as key2, v3.value as key3, v4.value as key4, v5.value as key5, v6.value as key6, v7.value as key7 FROM vet v LEFT JOIN vet v1 ON v1.id = v.id AND v1.`key` = "k1" LEFT JOIN vet v2 ON v2.id = v.id AND v2.`key` = "k2" LEFT JOIN vet v3 ON v3.id = v.id AND v3.`key` = "k3" LEFT JOIN vet v4 ON v4.id = v.id AND v4.`key` = "k4" LEFT JOIN vet v5 ON v5.id = v.id AND v5.`key` = "k5" LEFT JOIN vet v6 ON v6.id = v.id AND v6.`key` = "k6" LEFT JOIN vet v7 ON v7.id = v.id AND v7.`key` = "k7" WHERE v.form_id = 2 GROUP BY v.id
我认为我们现在应该坚持使用旋转表格的方法,如果巨大的差异是由于查询引起的,请查看我的查询。
请建议哪种解决方案更好,或者是否有其他更好的解决方案。
Sudesh