加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 在对象关系数据库中加入表继承映射与组合

发布时间:2020-12-20 13:44:15 所属栏目:Python 来源:网络整理
导读:我最近开始使用SQLAlchemy而没有任何SQL的先验知识.我一直面临的一个问题是如何引入多态行为.作为一个例子,考虑类似Reddit的Web应用程序;我们有一个文章模型和一个评论模型,两者都可以投票: class Article(Base): id = Column(Integer,primary_key = True)
我最近开始使用SQLAlchemy而没有任何SQL的先验知识.我一直面临的一个问题是如何引入多态行为.作为一个例子,考虑类似Reddit的Web应用程序;我们有一个文章模型和一个评论模型,两者都可以投票:

class Article(Base):
    id       = Column(Integer,primary_key = True)
    data     = Column(Text)
    comments = relationship('Comment')
    #... more article-related attributes
    votes      = relationship('Vote')
    vote_ups   = Column(Integer,default = 0)
    vote_downs = Column(Integer,default = 0) 

class Comment(Base):
    id   = Column(Integer,primary_key = True)
    data = Column(Text)
    #... more comment-related attributes
    votes      = relationship('Vote')
    vote_ups   = Column(Integer,default = 0)

我想分离两个模型共有的投票属性,这样我就不必为每个可以投票的模型重复代码.

我的第一个想法是创建一个新的VotesComponent模型,包含如下属性,

class VotesComponent(Base):
    votes      = relationship('Vote')
    vote_ups   = Column(Integer)
    vote_downs = Column(Integer)

与评论和文章模型建立多对一关系.

通过SQLAlchemy文档,我后来发现使用joined table inheritance可以实现类似的东西.首先这看起来非常方便,因为避免了额外的间接级别(即可以引用comment.votes而不是comment.votes_component.votes但是,我看到的一个很大的缺点是我的理解有限,不支持多重继承,而使用早期的方法,可以自由地向模型添加尽可能多的“组件”.

所以,我的问题是,使用继承映射而不是组合有什么好处,什么时候更好?为什么?在这种情况下,您会推荐两种(或许是不同的)方法中的哪一种?

编辑:我应该提一下,我希望能够分别查询模型的“投票”部分,以便我可以多态地处理投票.

解决方法

这是一个很好的问题,但是这里的主题是偏离主题,因为在stackoverflow上提出基于意见的答案的问题是不受欢迎的.也就是说,这是我的个人看法(我真的想避免开始一场火焰战争).

So,my question is,what are the benefits of using inheritance mapping over composition,and when is either preferable and why?

在大多数OO语言中,继承与“is-a”问题相关联,而组合与“has-a”问题相关联. Python中的组合通常通过多重继承来实现,因此“组合与继承”问题有点奇怪.该语言促进了Duck typing风格,因此“有一个”问题被认为更加惯用.

当我们谈论ORM时,还有其他含义:如何在引擎盖下实现继承?某些实现会将对象数据分布在多个表上并执行SQL JOIN,其他实现将使用单个表并执行SQL UNION.恕我直言,这不是你应该浪费精力思考的东西.第一个原因是它对您来说是透明的,这是使用ORM时的重点.其次,您缺乏判断哪一个更适合您的特定用例的知识(您将不得不深入研究SQL和几个RDBM的具体实现细节,以了解所涉及的性能影响).

我的建议是使用您喜欢的编程风格来实现它,相信ORM实现的选择并让性能问题出现在DBA中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读