我正致力于一个专注于特定利基的社交网站,并且我有关于存储用户配置文件信息的问题。虽然我希望用户能够存储诸如性别,职业,喜欢,不喜欢等信息,但我也希望以这种方式来完成这项工作,如果我想在将来添加更多配置文件字段,我可以做如此轻松甚至可能通过管理界面。以可扩展和可扩展的方式存储用户配置文件字段和信息
这里是数据库架构到目前为止,我已经构建:
用户
- ID(PK)
- 电子邮件
- 密码(等)
简介字段 (这将存储领域,如“性别”,“职业”,以及什么类型的输入期待:文本,列表,复选框,单选按钮等)
- ID(PK)
- FIELD_LABEL
- is_optional
- VALUE_TYPE(枚举:文本,文本区域,列表,下拉菜单,复选框,单选)
- is_multiple_allowed(仅适用于列表,真的)
个ProfileFields_Presets(这将存储用于任何给定的ProfileFields条目预设可选值,对于其中存在将条目仅当 VALUE_TYPE是列表,下拉列表,复选框,或无线电)
- ID(PK)
- GUID(针对HTML元素ID等)
- profile_field_id(FK:ProfileFields)
- SORT_ORDER
- field_preset(例如“男”, “女” 性别)
User_ProfileFields(这将存储关于各种ProfileFields条目用户输入)
- USER_ID(PK,FK:用户)
- profile_field_id(PK ,FK:ProfileFields)
- user_value(不管用户输入;这将是一个FK:ProfileFields_Values或文本的用户键入)
资料领域,如“性别” —其具有使得用户可以选择—将实施ProfileFields_Values数据库(存储的预置值)的预置值,而字段,诸如“职业” —其通常开放式—不会。
基本上,我只是想知道这是否足够。这样做会不会出现任何问题?
另外,在上面的Users_ProfileFields表中哪个更有效?只有一个* user_value *字段可存储外键ID或自定义输入?或者将它们分成* user_value_id *和* user_value_text *,其中两个中的一个总是空的,另一个填充数据?
了解有关EAV表的限制和性能影响以及执行报告查询和其他复杂SQL的难点。您应该尽可能使用正确的关系表,因为您可以设计正面。当真正需要灵活性时,EAV应该很少被使用。不要在关系数据库中关闭EAV路由,如果必须使用它,请考虑使用nosql数据库。 – HLGEM 2012-07-19 22:07:51
嗯...这是什么...而不是一个ProfileFields_Presets表,我在ProfileFields表中的字段中包含逗号分隔的预设列表?这会是一个更好的方式去做这件事吗? – TerranRich 2012-07-19 22:21:36
不,逗号分隔的列表更糟糕 – HLGEM 2012-07-19 22:28:14