许多有经验的开发人员建议不要使用Django多表继承,因为它的性能很差:
Django的疑难杂症:混凝土继承由雅各布·卡普兰,莫斯,Django的一个核心因素.
几乎在所有情况下,抽象继承是一种长期更好的方法.我看到在混凝土继承引入的负载下,有很多网站被粉碎,所以我强烈建议Django用户在大量怀疑的情况下使用具体的继承.
Django中的两勺由丹尼尔·格林菲尔德(@pydanny)
多表继承,有时称为"具体继承",作者和许多其他开发人员认为这是一件坏事.我们强烈建议不要使用它.
不惜一切代价,每个人都应该避免多表继承,因为它会增加混乱和大量开销.而不是多表继承,在模型之间使用显式OneToOneFields和ForeignKeys,以便您可以控制何时遍历连接.
但是没有多表继承,我不能轻易
另一个模型中的参考基础模型(必须使用GenericForeignKey或反向依赖);
(随意添加更多)
那么Django中这种继承有什么问题?为什么明确的OneToOneField更好?
性能对JOIN的影响有多大?有没有显示性能差异的基准测试?
不会select_related()
让我们连接被调用时控制?
django inheritance models concrete-inheritance multi-table-inheritance
我在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
我理解抽象类可能包含抽象和具体的方法(即使用body实现).我的问题是:子类可以从抽象超类继承/覆盖具体方法.其次,他们必须以与实现抽象方法相同的方式实现具体方法吗?
我正在使用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) 我正在尝试通过制作书籍笔记应用程序来学习 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 中实现这个模型?
inheritance ×3
python ×2
django ×1
doctrine ×1
java ×1
models ×1
orm ×1
peewee ×1
sqlalchemy ×1
symfony1 ×1