同一架构中的不同继承类型
Posted
技术标签:
【中文标题】同一架构中的不同继承类型【英文标题】:Different inheritance types in the same schema 【发布时间】:2011-06-08 09:29:09 【问题描述】:我在 symfony 项目中使用 Doctrine 1.2, 我正在考虑在我的模式中混合具体和列聚合继承类型: 列聚合让我可以在父表中查询并获取父记录和子记录,而具体的继承让我获得更清晰的架构。 另外,混合将在同一个继承链中。 我将如何编写模式文件?喜欢下面的?
A:
B:
inheritance:
extends: A
type: concrete
C:
inheritance:
extends: B
type: column_aggregation
keyField: type
keyValue: 1
或者像这样:
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
有什么危险/注意事项吗?
【问题讨论】:
看起来没有其他人有经验可以分享。不过我很想知道这是怎么回事——我最初的想法是它不会很好用。 @benlumley 好吧,我们已经尝试过了,我们正在测试,目前它似乎工作得很好。如果我们遇到一些问题,我会编辑我的帖子并添加评论。我们尝试了架构的第二个版本。 @greg0ire:当涉及到具体继承时,请注意关系 :-) 确保您没有在基表上定义它们。我从来没有在任何程度上混合和匹配,所以很想听到你遇到的任何问题...... @prodigitalson:你能详细说明一下吗?为什么继承关系是危险的?因为国外的别名。我会在这里发布我遇到的任何问题(包括这个问题,如果它是一个)。 @greg0ire:因为有了具体继承,基表 (A
) 已创建但未使用。如果您有指向A
的外键,则键检查将失败,因为数据实际上存储在B
中。只要您将关系保留在聚合表上,您就应该没问题。但在某些情况下,这会破坏以 A
开头的目的。
【参考方案1】:
只要你避免循环继承或菱形继承,你就可以使用它
一个循环继承(显然如下
A 类扩展 B B 类扩展 A
或
A 类扩展 C
B 类扩展 A
C 类扩展 A
Diamond 形状的继承更加圆润。当发生以下类型的情况时会发生这种情况
A类
B 类扩展 A
C 类扩展 A
D 类扩展 B、C
【讨论】:
您是说多继承可以通过教义实现吗?由于它不是 php,我对此表示怀疑......虽然词汇量 +1 我想说的是,只要这些约束不存在。我们可以安全地进行继承。以上是关于同一架构中的不同继承类型的主要内容,如果未能解决你的问题,请参考以下文章