代码之家  ›  专栏  ›  技术社区  ›  Timmy

属性是否有DB/ORM模式?

  •  0
  • Timmy  · 技术社区  · 15 年前

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

    animal
        id
        name
    
    attribute
        id
        name
    

    和映射

    animal_attribute
        animal_id
        attribute_id
    

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

    attribute_flying
        animal_id
        height
        length
        ..
    
    attribute_swimming
        animal_id
        depth
        ..
    

    有没有更好的办法?还有,对象布局在编程(python)中是如何工作的?

    1 回复  |  直到 15 年前
        1
  •  4
  •   uthark    15 年前

    你有几种选择。

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

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

    1. 很难加载动物的所有属性。(实际上,如果您想在一个查询中加载多个动物,那么您就卡住了)
    2. 很难对属性使用不同的值。
    3. 很难进行聚合查询。

    实际上,这就是所谓的实体属性值反模式,如《SQL反模式》一书中所述。

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

    1. 每个类层次结构的表
    2. 每个子类的表
    3. 每种混凝土等级的表

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

    sqlalchemy支持所有三种主要的继承类型,请阅读 documentation 选择最适合你需要的。