我们正在开发一个允许用户创建“促销”实例的平台,其中有任意数量的页面和与这些页面关联的“模块”。每个模块都有自己的可定制属性集合。我正在开发的模块之一是输入表单,它是主要组件。
该表单包含一些默认字段,例如姓名、出生日期和电子邮件地址。然后,该模块允许用户添加所需的任何类型的任意数量的附加字段(例如“25 个字或更少”的文本字段、额外的选择加入复选框等)。
我正在尝试计划如何在 MySQL 中的存储方面处理这些 X 个附加字段。需要对这些字段进行排序和过滤。
这似乎是一个已知且已解决的问题,但我没有正确地措辞或找到相关信息。我在搜索的过程中产生了一些想法;但每个人都有一个缺点,这让我认为一定有更好的方法:
- 为每个表单模块创建一个新表,其中包含作为新行的附加字段 - 这看起来确实很困惑/笨重。
- 将附加信息以 JSON(或其他数据格式)形式存储在额外的行中。将所有数据提取到 PHP 中,扩展 JSON 并使用 PHP 中的所有数据 - 我们设想会有大量条目(5-10k),所以我认为这效率太低了。
- 对其他字段设置上限,并向条目表附加一堆行,即“custom1”、“custom2”、“custom3”等。这看起来也很困惑。
再次查看第 2 点,我认为可能有一种方法可以获取额外行中的数据 block 并从中创建派生表,但我没有找到关于这是否可能的信息。例如:
SELECT * FROM( JSON_DECODE(entries.extra) ) ...
如果可能的话,这可能是我的偏好。
解决需要动态数量的附加行问题的正确方法是什么?
最佳答案
正确的解决方案很大程度上取决于您将如何使用数据。所有解决方案都有优点和缺点,您必须明白,您基本上是在尝试做一些关系数据库不是为之设计的事情。
今年早些时候我做了一个关于这个主题的演讲,名为 Extensible Data Modeling ,其中我尝试对不同的解决方案及其优缺点进行调查。
您也可以认输,并使用非关系数据库来存储非关系数据。
关于php - MySQL中如何处理动态列计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19508355/