orm与外键中可选列的一对多关系?

cyej8jka  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(226)

我想做些傻事,但让我们试试。
我正在使用sqlalchemy并定义以下两个表:

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    children = relationship("Child", cascade='all, delete-orphan')

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id', ondelete='CASCADE'))

到目前为止还不错,我的父母可以有多个孩子,当父母被删除的孩子方便地做同样的事情。
现在我想照顾孤儿。他们没有父母,但住在孤儿院。我先建孤儿院:

class Orphanage(Base):
    __tablename__ = 'orphanage'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    children = relationship("Child", cascade='all, delete-orphan')

但是现在我需要能够把孩子连接到孤儿院而不是父母。我想将子对象中的外键替换为如下内容:

custodian_id = Column(Integer, ForeignKey('parent.id' or 'orphanage.id', ondelete='CASCADE'))

有没有一个关系模型可以支持这一点?
谢谢您!

x9ybnkn6

x9ybnkn61#

基本上,您创建了一个“虚拟”父对象,但它并不位于父对象和子对象之间。您为孤儿院创建了一个表,但它将成为父级的另一个子表(或者可以反转)。解释比表现更难。我来演示一下(免责声明:我不知道sqlalchemy,所以格式可能非常正确,但您应该了解这个想法)。
首先,创建一个孤儿院表假设有额外的属性,并且您已经简化了这个问题。如果不是这样的话,那么仅仅向父级添加一个布尔值就足够了。

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    is_orphanage = Column(Boolean, default=False)
    children = relationship("Child", cascade='all, delete-orphan'))

这将确定孤儿和孤儿院,而不作额外的改动。但是,假设孤儿院有足够的其他处理方法,以下是一种方法:

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    children = relationship("Orphanage")
    children = relationship("Child", cascade='all, delete-orphan'))

class Orphanage(Base):
    __tablename__ = 'orphanage'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    parent_id = Column(Integer, ForeignKey('parent.id'))

 class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id', ondelete='CASCADE'))

一个例子可能是为了,但我将不得不这样做,从数据库方面。看这里的小提琴。
这只是几种可能性中的一种。总体思路是保留处理父-子处理的能力,不管子对象是否为孤儿,同时添加在需要时单独处理的能力。这样做只需对数据结构进行最小的更改。
我想我不提表继承是失职的。所以请跟随链接。也许孤儿院可以从父代继承(至少使用当前属性)。但我倾向于避免它,因为我不喜欢postgres的实现。但是,它可能与您的orm一起工作。希望这有帮助。

相关问题