Entity-attribute-value模型到底好不好
Posted | archive
最近看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 ;
缺点太多了:
- 太多row了,无法方便直接管理,甚至造成性能低下
- 想限制下数据很困难
- 无法利用外键
- 写query就是一坨浆糊
- 基本不可能生成复杂的分析和报告
但是我突然想到,类似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:
- EAV的最早期起源是LISP association lists,为了AI研究里的knowledge representation。其实这个association list就是n多attribute-value对。说白了就是n个key-value值。
- 一些EAV的实际例子:浏览器cookie,Microsoft Windows注册表,ASN.1
- EAV可以用sematic web里的RDF来描述,metadata用RDF Schema来描述。但是我个人而言是讨厌一大坨XML的。
- EAV和Subject-Predicate-Object本质是等价的
- XML可以被看成带tag的EAV。
- 比tagging更加高级的metadata玩法就是EAV
- object-oriented db其实在对象和逻辑上都不如EAV直观,我觉得EAV/CR是OO的超集
- EAV的代价就是非常复杂和容易出错的metadata处理。菜鸟玩metadata玩着玩着就把自己给meta了。
- EAV的特点是
- 超灵活
- 稀疏属性存储空间最优
- EAV的数据就是简洁直观的物理fact,而且很大程度上是自我描述的。
- 开放式物理schema,所以有的时候EAV也被称为open schema,而且EAV模型就是简化schema的主要手段。
- 和传统数据库不同,EAV的逻辑schema和物理schema非常不同。EAV的逻辑schema必须保存为metadata形式
- 足够丰富的EAV可以用来直接执行主动数据操作,相比而言传统数据库只能被动描述数据。(我又在YY这个传说中的deductive特性了)
- 云计算厂商搞的数据存储基本都是EAV。前面说的Google的datastore,支持GQL,支持的value数据类型也是最丰富的;Microsoft的Windows Azure Table Storage,在URL上调用LinQ provider;Amazon的SimpleDB支持查询语法和数据类型最少。
参考
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