2017-12-27 886 views
0

以下是sqlalchemy的文档。为什么SQLAlchemy关联对象中的外键标记为主键?

注意如何在关联类left_id和right_id,他们 第一标记为ForeignKey的,然后primary_key =真

这是有道理的,我认为他们应该是外键,因为逻辑上它们是外键的其他两张父母和孩子的桌子。

那么,让它们成为主键的目的是什么呢?

这是怎么回事?请解释。

class Association(Base): 
    __tablename__ = 'association' 
    left_id = Column(Integer, ForeignKey('left.id'), primary_key=True) 
    right_id = Column(Integer, ForeignKey('right.id'), primary_key=True) 
    extra_data = Column(String(50)) 
    child = relationship("Child", back_populates="parents") 
    parent = relationship("Parent", back_populates="children") 

class Parent(Base): 
    __tablename__ = 'left' 
    id = Column(Integer, primary_key=True) 
    children = relationship("Association", back_populates="parent") 

class Child(Base): 
    __tablename__ = 'right' 
    id = Column(Integer, primary_key=True) 
    parents = relationship("Association", back_populates="child") 

回答

0

这不是SQLAlchemy特有的。这就是如何设计many-to-many relationships,这是基于关系数据库设计的原则。

在多对多关系中,需要一个附加表,也称为关联表,它将第一个表中的条目与第二个表中的对应条目进行映射。

当关联表被定义时,我们需要一些主键来唯一标识关联表中的记录。使用主键可创建索引,从而加快联合操作和搜索记录。

那么,为什么所有的外键都作为关联表的主键的一部分呢? 这是为了确保没有重复条目atable A和记录bTable B。换句话说,要确保关系的唯一性,从而避免重复关系。

可以在不将外键声明为主键的情况下创建关联表。但这是不建议。通过这样做,除非明确创建索引,否则联接操作变得缓慢。而且,有很好的机会可以重复记录Table ATable B之间的关系

相关问题