【问题标题】:Using custom column fields instead of EAV使用自定义列字段而不是 EAV
【发布时间】:2015-12-23 00:10:00
【问题描述】:

我正在制作一个应用程序,其中包括一个用户信息管理部分。用户需要填写 10 个基本字段进行注册(名字、姓氏、地址等),但管理员还可以定义将包含在注册表单中的自定义字段。 目前我用 EAV 实现了它。我有一个表 "users" 包含所有 10 个基本字段作为列,users_custom_fields (field_id, field_name, field_type) 包含所有自定义添加的字段和一个表 "users_custom_data" (user_id, field_id, field_value),其中包含自定义字段的所有数据。

我的问题是:如果在 php 后端添加一个新字段只会在“用户”表中创建一个新列,而不是创建一个每个用户条目的一对多关系,那不是更好吗?匹配“user_custom_data”中的几行,这使得搜索变得非常困难并增加了不必要的复杂性? 如果应用程序动态更改表的结构,是否会被视为不好的做法?

谢谢

【问题讨论】:

  • 如果用户驱动的应用程序改变了你的表结构,那么你就失去了控制
  • 是的。这被认为是不好的做法
  • 使用 eav 的一个技巧是为每种数据类型设置单独的表,否则您最终会将所有内容都存储为 VARCHAR

标签: php mysql database entity-attribute-value


【解决方案1】:

“如果应用程序动态改变表的结构,这是否被认为是不好的做法?”

根据我的经验,是的。但是,您遇到了一个我认为它可能占有一席之地的地方。但是你已经弄清楚如何处理这引发的几个问题......

显示的字段名称存储在哪里?什么将跟踪这些新领域?等等……

您可以给每个这样的字段一个标准前缀,对创建它们的用户隐藏,并使用信息模式在运行时“查找”字段;但是您仍然必须处理可能对 sql 不友好的名称,或者如果用户希望将值限制为整数而不是任何有效字符串,该怎么办。所有这些都可以通过创建一个额外的表来保存元数据来解决,但随后您开始(在大多数情况下)使治疗(针对 EAV)比疾病更糟。

编辑:我几乎会尽快为“管理员”用户提供有限的界面来为这些东西制作额外的表格,而不是核心表格中的列。

【讨论】:

  • 如果自定义字段列不会添加到其余信息字段所在的主表中,而是添加到其自己的表中,例如。 “users”包含所有预定义字段,“users_custom”包含所有管理员创建的列。
  • 我仍然倾向于推荐 EAV,如上面@Strawberry 建议的那样,为不同类型提供单独的表格。如果这些自定义字段中的许多最终都是可选的,那么将它们全部放在一个表中可能会浪费大量空间。此外,如果需要类似“最喜欢的电影”列表,在 EAV 中包含多个条目(对于可变长度列表)要容易得多。
猜你喜欢
  • 2011-04-23
  • 2012-06-07
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 2023-03-11
  • 2019-03-30
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多