2012-12-19 30 views
6

我正在构建一个PHP/MySQL应用程序,我允许用户创建自己的自定义(尽可能多)他们的个人资料数据(即他们可以添加任何数量的信息到他们的配置文件,但有一个“核心”用户配置文件字段)MySQL,但不知道列名前手

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

一种方式是存储他们的其他信息作为JSON并将其存储在一个MySQL文本字段(我爱MySQL的:))

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

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

谢谢

+0

答案与往常一样,是_it depends_。如果你有成千上万的用户,你需要尝试各种解决方案,看看会发生什么。但是,对于相对较小的一组行的一小组选项,在现有的关系数据库中,JSON或序列化的PHP值是没有问题的。我认为WordPress的内部使用序列化的一些选项记录。 – halfer

+0

+1有趣的问题和一个不错的功能:-) –

回答

1

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

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

如果你这样做,请加控制,以限制用户可以创建新条目的数量或者你可能发现有人馅你的数据库有很多领域:)的

+0

谢谢雷从来没有想到这一点,但它可能?如果很多用户拥有大量的自定义字段,会变得非常庞大?你怎么看? –

+1

@BillJobs是的,这就是为什么你需要施加一些限制,就像用户最多只能创建10个自定义字段一样。 – Ray

+0

非常非常真实,限制对于“自定义数据”是有意义的 –

3

一种方式来处理,这是使用使用EAV范例的单个表或实体属性值。请参阅Wikipedia article。在许多方面,这要比让用户选择数据库模式更为整齐。

+0

看起来非常有趣,介绍似乎解决了我的问题......这是原生的MySQL还是设计范例? –

+1

这对任何关系数据库来说都是天作之合。我猜想它也可以用于电子表格。 – wallyk

0

MySQL可以处理这个很好。如果额外的数据总是一起被抽出(即你不需要获得只有宠物字段没有任何其他字段),那么你可以将它存储在users表的一列中。但是,如果您需要更多关系模型,则可以将额外数据存储在由用户标识链接的单独表中。额外的表格将有一个用于用户ID的列,附加字段名称附加字段值以及您可能需要的任何其他字段值。然后,只需运行JOIN查询即可获取配置文件以获取所有额外字段。

+0

感谢您的回复G-Nugget,是我唯一的选择,当我不知道列名前手? –

+0

@BillJobs不,您可以使用新的字段名称和值将新行插入附加信息表中。 –