php - MySQL中如何处理动态列计数

标签 php mysql

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

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

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

这似乎是一个已知且已解决的问题,但我没有正确地措辞或找到相关信息。我在搜索的过程中产生了一些想法;但每个人都有一个缺点,这让我认为一定有更好的方法:

  1. 为每个表单模块创建一个新表,其中包含作为新行的附加字段 - 这看起来确实很困惑/笨重。
  2. 将附加信息以 JSON(或其他数据格式)形式存储在额外的行中。将所有数据提取到 PHP 中,扩展 JSON 并使用 PHP 中的所有数据 - 我们设想会有大量条目(5-10k),所以我认为这效率太低了。
  3. 对其他字段设置上限,并向条目表附加一堆行,即“custom1”、“custom2”、“custom3”等。这看起来也很困惑。

再次查看第 2 点,我认为可能有一种方法可以获取额外行中的数据 block 并从中创建派生表,但我没有找到关于这是否可能的信息。例如:

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

如果可能的话,这可能是我的偏好。

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

最佳答案

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

今年早些时候我做了一个关于这个主题的演讲,名为 Extensible Data Modeling ,其中我尝试对不同的解决方案及其优缺点进行调查。

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

关于php - MySQL中如何处理动态列计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19508355/

相关文章:

mysql - 结合 select distinct 和 order by

PHP - 使用数组值满足特定条件并执行操作

php - 如何创建搜索表单,其中用户可以搜索三列。使用 PHP AND SQL AND HTML

Javascript 时间戳转 php - mysql 时间戳类型

php - Mysql日期范围查询只检查日期,不检查月份和年份

php - Symfony 3 从现在开始找到最近的日期

mysql - SQL中的主键和外键?

php - SQLSTATE[23000] : Integrity constraint violation: 1052 Column 'NRP' in where clause is ambiguous

mysql - 使用大 in() 子句优化 MySQL 查询

PHP fatal error : Call to a member function getAttribute() on a non-object