使用自定义列字段而不是 EAV

Using custom column fields instead of EAV

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

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

谢谢

"Is it considered bad practice if the application dynamically alters the structure of a table?"

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

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

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

编辑:我几乎会尽快为 "admin" 用户提供有限的界面,以便为这些内容创建额外的 table,而不是核心 table 中的列。