2010-09-28 47 views
0

我想创建具有不同键值作为属性的对象,例如:是否有属性的DB/ORM模式?

animal 
    id 
    name 

attribute 
    id 
    name 

和映射

animal_attribute 
    animal_id 
    attribute_id 

所以我可以有一个条目“鸭”,它具有多个属性“飞”,‘游泳’,等等。每个属性类型将有自己的定义表一些变量

attribute_flying 
    animal_id 
    height 
    length 
    .. 

attribute_swimming 
    animal_id 
    depth 
    .. 

有没有更好的方式来做到这一点?此外,对象布局如何在编程(Python)中工作?

回答

4

你有几种选择。 如果对象没有很深层次,只有几个属性,那么您可以创建一个表并为需要支持的每个属性添加列。

其他方法是为每个对象创建表并将每个属性映射到不同的属性柱。要使用

方法不是很好,由于下列问题:

  1. 很难检查是否所有必需的attibutes是现有的动物。
  2. 很难加载动物的所有属性。 (实际上,如果你想在一个查询中加载几个动物,那么你卡住了)
  3. 很难为属性使用不同的值。
  4. 很难进行汇总查询。

实际上,这就是所谓的Entity-Attribute-Value反模式,如SQL反模式手册中所述。

要解决此反模式,需要重新考虑如何将继承存储在数据库中。有几种方法:

每类层次结构
  1. 表每个子类
  2. 表每个具体类

精确解决方案取决于你的任务,目前这是很难决定什么是最好的解决方案。可能你应该使用每个子类的表。在这种情况下,您将在一个表中存储公共属性,并且所有针对该动物的特定属性都会转到附加表中。

sqlalchemy支持所有三种主要类型的继承,请阅读关于documentation中的继承配置并选择最适合您需求的内容。

+0

感谢您的反模式评论。建议什么? – Timmy 2010-09-28 19:26:32

+0

我已经更新了与sqlalchemy文档链接的答案。 – uthark 2010-09-28 19:27:48

+0

我的意思是解决EAV问题 – Timmy 2010-09-28 19:49:06

相关问题