【问题标题】:MySQL but don't know the column names before handMySQL 但事先不知道列名
【发布时间】:2012-12-19 21:20:12
【问题描述】:

我正在构建一个 PHP/MySQL 应用程序,我允许用户创建他们自己的自定义(尽可能多)配置文件数据(即,他们可以使用额外的文本框将任意数量的信息添加到他们的配置文件中,但是有一个“CORE”组用户配置文件字段)

例如,他们可以在表单上创建一个新文本框并将其称为“我的宠物”和/或“我最喜欢的颜色”。我们需要将这些数据存储在数据库中,并且显然不能为他们的每个选择创建列,因为我们事先不知道他们的附加信息是什么。

我们认为我们可以存储他们提供的所有“附加信息”的一种方法是将他们的附加信息存储为 JSON 并将其存储在 MySQL 文本字段中(我喜欢 MySQL :))

我见过 Wordpress 表单构建器插件,您可以在其中创建自己的字段,因此我认为它们必须以某种方式将数据存储在 MySQL 中,因为 NoSQL 解决方案超出了这些插件的范围。

我很想继续使用 MySQL,但你们认为 MongoDB/Redis 这样的 NoSQL 解决方案会是一个更好的解决方案吗?

谢谢

【问题讨论】:

  • 答案一如既往,视情况而定。如果您有数十万用户,您将需要尝试各种解决方案以查看可以扩展的内容。但是,对于相对较小的一组行的一小组选项,JSON 或序列化的 PHP 值,在您现有的关系数据库中,就可以了。我认为 Wordpress 在内部对其一些选项记录使用序列化。
  • +1 一个有趣的问题和一个不错的功能:-)

标签: php mysql


【解决方案1】:

解决此问题的一种方法是使用使用 EAV 范例或实体-属性-值的单个表。请参阅Wikipedia article。在大多数方面,这比让用户选择数据库模式要整洁得多。

【讨论】:

  • 看起来很有趣,而且介绍似乎解决了我的问题......这是 MySQL 原生的还是设计范式?
  • 它非常适合任何关系数据库。我想它也可以在电子表格中使用。
【解决方案2】:

您可以创建一个键值对表,其中将存储任何不在核心中的内容。该表如下所示:user_id、name_of_user_specified_field、user_specified_value;

任何 name_of_user_specified_field 开始出现很多,然后您可以添加到核心表中。这称为实体-属性-值。请注意,有些人认为这是一种反模式。

如果您这样做,请添加控件以限制用户可以创建的新条目的数量,否则您可能会发现有人用大量字段填充您的数据库:)

【讨论】:

  • 谢谢 Ray 从来没有想过这个,但它可能 ???如果很多用户有很多自定义字段,会变得庞大吗?你怎么看?
  • @BillJobs 是的,这就是为什么您需要施加一些限制,例如用户最多只能创建 10 个自定义字段。
  • 非常非常正确,“自定义数据”的限制是有意义的
  • 有趣的是,我希望人们说“MySQL 很烂,NoSQL 解决方案正是您正在寻找的”,因为“列名”没有被强制执行......不是这样......建议坚持MySQL 和提供的所有解决方案(谢谢)还是只为这些数据使用 MongoDB 并将其拉入?
  • @BillJobs 对于这种有限的情况,我没有足够的细节来告诉您关系数据库还是非关系数据库是您的最佳选择。如果您愿意在新问题中提供有关当前架构、核心用例和报告需求的完整详细信息,您可能会征求很多好的建议。
【解决方案3】:

MySQL 可以很好地处理这个问题。如果额外的数据总是要一起被提取出来(即你永远不需要只得到 pet 字段而没有任何其他额外的字段),那么你可以将它序列化存储在 users 表的列中。但是,如果您需要更多关系模型,则可以将额外数据存储在由用户 ID 链接的单独表中。附加表将包含用户 ID 列、附加字段名称附加字段值以及您可能想要的任何其他内容。然后,您只需在获取配置文件时运行 JOIN 查询即可获取所有额外字段。

【讨论】:

  • 感谢 G-Nugget 的回复,当我事先不知道列名时,序列化是我唯一的选择吗?
  • @BillJobs 不,您可以在附加信息表中插入一个新行,使用新的字段名称和值。
猜你喜欢
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 2012-05-28
  • 2014-07-13
  • 1970-01-01
  • 2012-05-22
  • 2013-11-10
相关资源
最近更新 更多