6

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

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

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

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

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

谢谢

4

3 回答 3

3

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

于 2012-12-19T21:25:23.040 回答
1

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

任何开始大量显示的 name_of_user_specified_field 都可以添加到核心表中。这称为实体-属性-值。请注意,有些人认为这是一种反模式。

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

于 2012-12-19T21:24:49.627 回答
0

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

于 2012-12-19T21:25:28.080 回答