标签: concrete-inheritance

我应该以任何方式避免Django中的多表(具体)继承吗?

许多有经验的开发人员建议不要使用Django多表继承,因为它的性能很差:

  1. Django的疑难杂症:混凝土继承雅各布·卡普兰,莫斯,Django的一个核心因素.

    几乎在所有情况下,抽象继承是一种长期更好的方法.我看到在混凝土继承引入的负载下,有很多网站被粉碎,所以我强烈建议Django用户在大量怀疑的情况下使用具体的继承.

  2. Django中的两勺丹尼尔·格林菲尔德(@pydanny)

    多表继承,有时称为"具体继承",作者和许多其他开发人员认为这是一件坏事.我们强烈建议不要使用它.

    不惜一切代价,每个人都应该避免多表继承,因为它会增加混乱和大量开销.而不是多表继承,在模型之间使用显式OneToOneFields和ForeignKeys,以便您可以控制何时遍历连接.

但是没有多表继承,我不能轻易

  1. 另一个模型中的参考基础模型(必须使用GenericForeignKey或反向依赖);

  2. 获取基本模型的所有实例.

    (随意添加更多)

那么Django中这种继承有什么问题?为什么明确的OneToOneField更好?

性能对JOIN的影响有多大?有没有显示性能差异的基准测试?

不会select_related()让我们连接被调用时控制?


我已经将具体示例移到了一个单独的问题,因为这个问题变得过于宽泛,并且添加了使用多表继承的原因列表.

django inheritance models concrete-inheritance multi-table-inheritance

40
推荐指数
4
解决办法
7026
查看次数

同一模式中的不同继承类型

我在symfony项目上使用Doctrine 1.2,我正在考虑在我的模式中混合具体和列聚合继承类型:列聚合让我在父表中查询并获取父记录和子记录,而具体的继承让我得到更清洁的架构.此外,混合将在同一个继承链中.我该如何编写模式文件?喜欢以下?

A:

B:
  inheritance:
    extends: A
    type: concrete

C:
  inheritance:
    extends: B
    type: column_aggregation
    keyField:         type
    keyValue:         1
Run Code Online (Sandbox Code Playgroud)

或者这样或许:

A:

B:
  inheritance:
    extends: A
    type: concrete

C:
  inheritance:
    extends: B
    type: concrete
D:
  inheritance:
    extends: C
    type: column_aggregation
    keyField:         type
    keyValue:         1


E:
  inheritance:
    extends: C
    type: column_aggregation
    keyField:         type
    keyValue:         2
Run Code Online (Sandbox Code Playgroud)

有危险/警告吗?

inheritance doctrine symfony1 concrete-inheritance column-aggregation

26
推荐指数
1
解决办法
1170
查看次数

抽象类中的具体方法

我理解抽象类可能包含抽象和具体的方法(即使用body实现).我的问题是:子类可以从抽象超类继承/覆盖具体方法.其次,他们必须以与实现抽象方法相同的方式实现具体方法吗?

java inheritance abstract-class concrete-inheritance

8
推荐指数
2
解决办法
3万
查看次数

SQLAlchemy与具体继承的多态关系

我正在使用SQLAlchemy的具体表继承.在声明样式模型类中,我已成功配置它.

我的代码就像:

class Entry(AbstractConcreteBase, db.Model):
    """Base Class of Entry."""

    id = db.Column(db.Integer, primary_key=True, nullable=False)
    created = db.Column(db.DateTime, nullable=False)
    post_id = declared_attr(lambda c: db.Column(db.ForeignKey("post.id")))
    post = declared_attr(lambda c: db.relationship("Post", lazy="joined"))

    @declared_attr
    def __tablename__(cls):
        return cls.__name__.lower()

    @declared_attr
    def __mapper_args__(cls):
        # configurate subclasses about concrete table inheritance
        return {'polymorphic_identity': cls.__name__,
                'concrete': True} if cls.__name__ != "Entry" else {}

class TextEntry(Entry):
    """Text and Article Entry."""

    text = db.deferred(db.Column(db.Text, nullable=False))

class PhotoEntry(Entry):
    """Photo Entry."""

    path = db.deferred(db.Column(db.String(256), nullable=False))
Run Code Online (Sandbox Code Playgroud)

它在shell中测试时工作正常:

>>> from models.entry import Entry
>>> …
Run Code Online (Sandbox Code Playgroud)

python orm sqlalchemy concrete-inheritance flask-sqlalchemy

5
推荐指数
1
解决办法
3208
查看次数

Peewee 和数据库继承

我正在尝试通过制作书籍笔记应用程序来学习 Peewee 和 Bottle。

假设我有以下实体:

Subject
Book
Chapter
Note
Tag
Run Code Online (Sandbox Code Playgroud)

我希望能够为章节、书籍和主题做笔记。

在数据库中,你会这样做:

Subject
Book
Chapter
Note
Tag
Run Code Online (Sandbox Code Playgroud)

(如果你想要 note 和 notable 之间的 M:N 关系,你也可以做一个 note_notable 桥接表)。

您将在主题、书籍和章节上插入触发器之前,将一行插入到 noteable 中,检索新行的 noteable_id,并在传入的行上使用它。

我假设如果您使用像 Peewee 这样的 ORM,您会希望在应用程序逻辑而不是触发器中执行此操作。

我如何在 Peewee 中实现这个模型?

python single-table-inheritance concrete-inheritance peewee

4
推荐指数
1
解决办法
2111
查看次数