所以我需要在数据库中构建管理员用户可以在没有我的情况下添加和删除模型。我想将模型中的每个字段放在一个单独的表中,而不是一个大表中的所有值和所有值的普通类型,以及该字段需要的任何内容。
因此,一个人的模型示例可能是:
字段名 | 类型 |
---|---|
姓名 | varchar |
生日 | 日期 |
地址 | int(链接到模型) |
然后数据库可以包含 3 个表:
- 一个使用 EntityId 和 varchar 来存储名称。
- 一个带有 EntityID 和 Date 来存储日期
- 一个用EntityId和EntityID指向地址模型
选择会做很多连接,但我们可以索引需要搜索的字段,EntityId 将是一个 int 并且总是被索引。
asp.net 服务器将保持对模型的控制并构建只选择他们需要的查询。
您是否看到任何重大问题,我知道我们不喜欢 EAV,我们现在被锁定到 sql server。
我不是DBA人...
EAV 的所有实现,即使您有您所描述的那种“元数据表”,也会导致内部平台效应:
您可以在客户端层中编写代码来实现数据类型和简单约束等基本事物的强制执行。
例如,您可以将 varchar、date 和 integer 属性分成三个表,这是对的。或者,您可以创建一个包含 varchar、日期和整数三列的单个属性表,并将您的值存储在给定属性的正确数据类型的列中,而其他两个将为 NULL。
但无论哪种方式,您的客户端应用程序如何知道要使用哪个表或哪个列?您必须编写客户端代码来查询每个字段的元数据表,并通过条件逻辑构建 SQL 查询。每次。无论查询在普通数据库中多么简单,现在它都成为一项重大工作,您最终将编写查询模板构建器代码的屏幕和屏幕以尝试使其更容易。
然后,您可能具有给定模型所必需的一些属性。在正常的表设计中,您只需将一列指定为 NOT NULL。但是在这里,您必须在元数据表中添加更多列才能将属性定义为强制属性。
然后你可能还会考虑每个属性是否可以有一个 DEFAULT。或字符集和排序规则。或不同的类型,如 DECIMAL。
考虑如何在 EAV 表中为 UNIQUE 约束建模。或 FOREIGN KEY 约束。
最终,您将在数据库中实现一个数据库。这就是内部平台效应。
可以做到,但工作量很大,而且你要为不可避免的错误负责。完整的关系数据库需要数十甚至数百工程师年才能实现,而且它们仍然存在错误。