为什么 SQLAlchemy 关联对象中的外键被标记为主键?

Ben*_*uch 3 python sqlalchemy flask-sqlalchemy

以下是sqlalchemy的文档。

注意关联类中的left_id和right_id是如何先标记为ForeignKey然后primary_key = True

对我来说,它们应该是外键是有道理的,因为从逻辑上讲,它们是其他两个父表和子表的外键。

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

这里发生了什么?请解释。

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")
Run Code Online (Sandbox Code Playgroud)

pbs*_*mar 5

这不是 SQLAlchemy 独有的。这就是many-to-many relationships设计的方式,它基于关系数据库设计的原则。

在多对多关系中,需要一个额外的表,也称为关联表,它将第一个表中的条目映射到第二个表中的对应条目。

在定义关联表时,我们需要一些主键来唯一标识关联表中的记录。拥有一个主键会创建一个索引,从而加快连接操作和搜索记录的速度。

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

可以在不将外键声明为主键的情况下创建关联表。但这是不可取的。通过这样做,除非显式创建索引,否则连接操作会变慢。而且,很有可能会重复记录Table ATable B