是否存在属性的DB / ORM模式?

时间:2010-09-28 19:13:45

标签: python database database-design sqlalchemy

我想创建一个具有不同键值作为属性的对象,例如:

animal
    id
    name

attribute
    id
    name

和映射

animal_attribute
    animal_id
    attribute_id

所以我可以有一个条目“duck”,它有多个属性“flying”,“swimming”等。每个属性类型都有自己的表定义一些变量

attribute_flying
    animal_id
    height
    length
    ..

attribute_swimming
    animal_id
    depth
    ..

有更好的方法吗?对象布局如何在编程(python)中起作用?

1 个答案:

答案 0 :(得分:4)

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

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

由于以下问题,您想要使用的方法不是很好:

  1. 很难检查动物是否存在所有必需的属性。
  2. 很难加载动物的所有属性。 (实际上,如果你想在一个查询中加载几个动物,那么你就卡住了)
  3. 很难为属性使用不同的值。
  4. 很难进行汇总查询。
  5. 实际上这就是所谓的Entity-Attribute-Value反模式,如SQL Antipatterns一书中所述。

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

    1. 每个类层次结构的表
    2. 每个子类的表
    3. 每个具体类的表
    4. 完全解决方案取决于您的任务,目前很难确定什么是最佳解决方案。可能你应该使用每个子类的表。在这种情况下,您将在一个表中存储公共属性,并且动物的所有特定属性都会转到附加表中。

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