Entity-attribute-value模型到底好不好

最近看NoSQL发现entity-attribute-value(简称EAV)这个模型真王道啊,Google App Engine的 datastore就是个典型的entity-attribute-value模型:

The App Engine datastore saves data objects, known as entities. An entity has one or more properties, named values of one of several supported data types. For instance, a property can be a string, an integer, or even a reference to another entity.

但是在Stackoverflow上发现大家对EAV评价非常低,说这是个very bad design

比如把一个表

搞成这种EAV模型的设计:

然后一个简单的SQL就从

SELECT first_name, last_name
FROM Employees
WHERE date_of_birth > '12/31/1950' ;

变成了

SELECT MAX( CASE emp_property WHEN 'first_name'
                              THEN value
           END ) AS first_name,
      MAX( CASE emp_property WHEN 'last_name'
                             THEN value
           END ) AS last_name
  FROM EmployeeValues
 WHERE emp_nbr IN ( SELECT emp_nbr
                      FROM EmployeeValues
                     WHERE emp_property = 'date_of_birth'
                       AND CAST( value AS DATETIME ) > '12/31/1950' )
   AND emp_property IN ( 'first_name', 'last_name' )
 GROUP BY emp_nbr ; 

缺点太多了:

但是我突然想到,类似memcached和redis这种key-value不是恰好避免了这些缺点而发挥了EAV的优点吗?在stackoverflow上看到类似的评价:

为是么entity-attribute-value不好?

because they are inefficient usage of relational databases. A purely key/value store works great with this model.

类似MongoDB这种document db就更好了,非常适合做EAV模型的数据存储和处理。

现在觉得,NoSQL 其实代表 NoACID,而真正替代 Relational 的革命性的东西就是 EAV。

关于EAV的一些trivia:

参考

1: http://ycmi.med.yale.edu/nadkarni/eav_cr_contents.htm
2: http://en.wikipedia.org/wiki/Entity-attribute-value_model

ps 中文搜索EAV模型全是关于magento的。。。或许现实中最急迫的EAV应用就是电子商务吧?

Comments