如何处理MySQL中的动态列计数

时间:2013-10-22 03:14:48

标签: php mysql

我们正在开发一个平台,允许用户创建“促销”实例,其中有任意数量的页面和与这些页面相关联的“模块”。每个模块都有自己的可自定义属性集合。我正在开发的模块之一是输入表单,它是主要组件。

表单包含一些默认字段,例如姓名,出生日期和电子邮件地址。然后,该模块允许用户添加他们需要的任何类型的其他字段(例如,“25个字或更少”文本字段,额外的选择加密复选框等)。

我正在尝试计划如何在MySQL存储方面处理这些X附加字段。对这些字段进行排序和过滤是必需的。

这似乎是一个已知和已解决的问题,但我没有任何运气,无论是正确措辞还是遇到相关信息。我在搜索时有些想法;但是每个人都有一个垮台让我认为必须有一个更好的方法:

  1. 为每个表单模块创建一个新表,其中包含其他字段作为新行 - 这看起来非常混乱/笨重。
  2. 将附加信息存储为JSON(或其他一些数据格式)的额外行。将所有数据拉入PHP,扩展JSON并使用PHP中的所有数据 - 我们设想大量条目(5-10k),所以我认为这样效率太低。
  3. 对其他字段设置上限并在条目表中添加一堆行,即'custom1','custom2','custom3'等。这似乎也非常混乱。
  4. 再看第2点,我认为可能有一种方法可以在额外的行中获取数据块并从中创建一个派生表,但我没有找到有关这是否可能的信息。例如:

    SELECT * FROM( JSON_DECODE(entries.extra) ) ...
    

    如果可能,那可能是我的偏好。

    解决需要动态数量的额外行的问题的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

正确的解决方案很大程度上取决于您将如何使用数据。所有解决方案都有优点和缺点,您必须明白,您基本上是在尝试做一些关系数据库不适用的事情。

我在今年早些时候发表了一篇名为Extensible Data Modeling的关于这个主题的演讲,其中我试图提供一个关于不同解决方案及其利弊的调查。

您也可以放弃,并使用非关系数据库来存储非关系数据。