我正在制作一个应用程序,除此之外,还有一个用户信息管理部分。用户填写的10个基本字段用于注册(名字,姓氏,地址等),但管理员也可以定义将包含在注册表单中的自定义字段。 目前我用EAV实现了它。我有一个表“users”,其中包含所有10个基本字段作为列 users_custom_fields ( field_id,field_name,field_type ),其中包含所有自定义添加的字段和表“users_custom_data”(user_id,field_id,field_value),其中包含自定义字段的所有数据。
我的问题是:如果在php后端添加一个新字段只是在“users”表中创建一个新列而不是创建一对多关系,而且每个用户条目也是匹配“user_custom_data”中的几行,这使搜索真的很难,并增加了不必要的复杂性? 如果应用程序动态地改变表的结构,它被认为是不好的做法吗?
由于
答案 0 :(得分:1)
“如果应用程序动态地改变表的结构,它被认为是不好的做法吗?”
根据我的经验,是的。但是,你已经遇到了一个我认为可能占有一席之地的地方。但是你已经弄清楚如何处理这个问题......
显示的字段名称存储在哪里?什么会跟踪这些新领域?等...
您可以为每个此类字段提供隐藏给创建它们的用户的某种标准前缀,并使用信息模式在运行时“查找”字段;但你仍然需要处理可能不是sql友好的名称,或者如果用户想要限制为整数的值,而不是任何有效的字符串。所有这些都可以通过创建一个额外的表来保存元数据来解决,但随后你开始(在大多数情况下)治愈(对于EAV)比疾病更糟糕的道路。
编辑:我几乎不会给“admin”用户提供有限的接口来为这些内容制作额外的表而不是核心表中的列。