您能告诉我们如何将不同类型的属性值存储为EAV吗?
我现在看到3个选项。
我想我现在需要:字符串,数字(整数)和日期类型,但稍后可能会出现其他类型。
谢谢。
答案 0 :(得分:1)
在RDBMS社区中,EAV是一个反模式。对于使用EAV获得的“无限灵活性”,将数据重新构建为记录/对象所需的SQL要复杂得多。您还可以获得无法使用任何可用的数据完整性工具(外键,检查约束等)的“好处”。随着时间的推移,此设计会在其自身重量下崩溃。
如果您有一个用例,其中数据元素是超类型/子类型关系的一部分,但它们没有太大变化,那么根据您的需要对表进行建模:
1。)类表继承=具有公共父类的特定子类型表。当超类型和子类型都具有大量独特属性时,这是最好的。
2.)Concrete Table Inheritance =将公共超类型列放在每个子类型的表中。当超类型没有很多自己的属性时,这种方法效果会更好,但是子类型可以。
3.)Single Table Inheritance =将所有子类型的列与超类型列放在一起。与特定行的子类型无关的列具有NULL值。这最适用于每个子类型没有多个唯一属性或多个子类型共享列/属性时。
你可以混合和匹配那些3,但我建议坚持使用其中一种设计。
如果您真的需要使用EAV,如果您的EAV设计中有相对较小比例的数据(与整个数据库相比),则在RDBMS中使用XML列。如果您的大量数据存储在EAV中,那么RDBMS就不是您需要的工具。查看文档/ NoSQL / Key-Value数据库,如MongoDB,Cassandra等。实现EAV的RDBMS,如果不是早期,最终会成为编码的噩梦。
考虑到你的问题日期,我很想知道你选择了哪条路线,你学到了什么,你喜欢/不喜欢什么等等。