同意已经给出的答案。
针对 EAV 的最明显案例是当存在涉及您提到的属性的业务规则时。比如说,在您的示例中,“属性 1 和属性 2 不能都长于……字符。”。
如果您使用单个三列表来实现示例,那么实现该业务规则就像在该表上定义单个 CHECK 约束一样简单明了。该规则将简单明了,也可供稍后阅读您的设计的其他人解码,并且在运行时,检查约束将像旋风一样进行。
如果您使用 EAV 方法实现您的示例,则无法以声明方式实现相同的业务规则,因此它将需要(相当多)额外代码,对于以后阅读设计的任何人来说,这将更难以解码,这出错的机会更多,尤其是在事务序列化领域,并且在运行时它可能最终成为性能噩梦,使您的系统像没有腿的狗一样运行。
您还可以询问您的朋友他打算如何在他的设计中包含属性,如果这些属性的值是整数、日期、浮点数、布尔值或 DBMS 必须提供的任何其他类型。(他不能坚持一个表而不产生性能问题,即在读取时必须取消对任何数字的字符串,并在写入时对任何数字进行字符串。这是一个 CPU 占用的噩梦。)
您的朋友“发现”的实际上是DBMS 本身用于记录用户数据库结构的设计。DBMS 目录已经知道这种结构几十年了(当然,除了“V”部分之外,目录是 EA,可以说是没有 V 的 EAV),所以它在任何意义上都不是一个“新”的想法。
所以是的,当他声称通过他的设计可以更容易地调整数据库的结构时,从某种意义上说,他是对的。但在大多数情况下,为提高灵活性付出的代价高得令人望而却步,特别是如果您还考虑到“提高灵活性”的实际附加值(通常低于 EAV 支持者的建议)。
可以接受EAV 方法的典型案例是处理问卷。如果问卷不是真的 99.99% 稳定(随着时间的推移会延长很多),并且适用于“应该如何填写”的“规则”并不多(如果问题 7 的答案是“是”,那么问题 8 必须回答),并且问卷的答案通常在“孤立”中比在“组合”中更多地检查,那么 EAV 的大多数缺点都不适用,并且可以有效地考虑。