我会避免EAV,除非我正在建立一个有成千上万种产品的医疗信息库。类表继承是一个适当的解决方案,在运行时改变模式并不是什么坏主意。
假设你正在建立一个网上商店,你有不同的产品具有不同的属性。通常,产品正在使用一组属性。通过使用Class Table Inheritance模式,您可以为每个产品组使用一个表,继承具有常见产品属性的公共表。当需要一个新的属性,你有两个选择:
- 改变安放台和带有属性名称
- 创建一个新的集(即新表)与新列添加一个新的列并设置当前产品设置为继承新产品,从而添加新的属性。
在运行时更改表可能确实会导致问题,因为在更改过程中发生锁定。然而,从MySQL 5.6开始,程序员可以指定一个LOCK类型,例如LOCK = NONE,也可以ALTER ONLINE | OFFLINE。显然,DB供应商正在朝这个方向努力,以便在运行期间进行数据库更改。
表锁定问题也可以避免/最小化。锁定问题通常发生在改变巨大的表格(即100k +记录)时。但是,继承允许分配不同集合中的产品,因此每个表的记录数量相对较少。
例如,如果我们有10种不同类型的产品,我们有10个不同的表格。假设我们每种类型都有10000个产品,这意味着我们有超过10万个产品,但是在一个集合中添加一个新属性实际上只会在具有10000个行的表中添加一个新列。在具有10k行的表中添加新列的时间会少于一秒,因此在处理类表时继续改变数据库模式继承真的是个坏主意?
我很乐意在这里听到更多意见。多谢你们。
谢谢本。我需要在下周推出这个特定的项目,根据你的回答,我会坚持采用EAV方法,但面向文档看起来像是最好的解决方案。有人能够评论我提出的模式吗? – 2010-08-05 02:10:20