我正在构建一个PHP / MySQL应用程序,我允许用户创建自己的自定义(尽可能多的)配置文件数据(即他们可以添加任何数量的信息到他们的配置文件与其他文本框,但有一个“CORE”用户配置文件字段集)
例如,他们可以在表单上创建一个新的文本框,并将其称为“我的宠物”和/或“我最喜欢的颜色”。我们需要将这些数据存储在数据库中,并且显然无法为每个选项创建列,因为我们不知道他们的附加信息是什么。
我们认为我们可以存储他们提供的所有“addidional信息”的一种方式是将他们的附加信息存储为JSON并将其存储在MySQL文本字段中(我喜欢MySQL :))
我已经看过Wordpress表单构建器插件,您可以在其中创建自己的字段,因此我认为他们必须以某种方式将数据存储在MySQL中,因为NoSQL解决方案超出了这些插件的范围。
我很想坚持使用MySQL,但是你们认为像MongoDB / Redis这样的NoSQL解决方案会是一个更好的解决方案吗?
由于
答案 0 :(得分:3)
解决此问题的一种方法是使用EAV范例或实体属性值使用单个表。请参阅Wikipedia article。在大多数方面,这比让用户选择数据库模式要简单得多。
答案 1 :(得分:1)
您可以创建一个键值对表,其中不存储核心内的任何内容。该表如下所示:user_id,name_of_user_specified_field,user_specified_value;
任何name_of_user_specified_field开始显示很多,然后你可以添加到核心表。这称为实体 - 属性 - 值。请注意,有些人认为这是一种反模式。
如果你这样做,请添加控件以限制用户可以创建的新条目的数量,或者你可能会发现有人填充你的数据库中有很多字段:)
答案 2 :(得分:0)
MySQL可以很好地处理这个问题。如果总是将所有附加数据全部拉出(即,您将永远不需要只获取pet字段而没有任何其他字段),那么您可以将其序列化存储在users表的列中。但是,如果您需要更多关系模型,则可以将额外数据存储在由用户ID链接的单独表中。附加表将包含用户ID列,附加字段名称附加字段值以及您可能需要的任何其他值。然后,您只需在获取配置文件时运行JOIN
查询即可获得所有额外字段。