以下是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")
答案 0 :(得分:2)
这不是SQLAlchemy独有的。这就是many-to-many relationships
的设计方式,它基于关系数据库设计的原则。
在多对多关系中,需要一个附加表,也称为关联表,它将第一个表中的条目与第二个表中的相应条目进行映射。
当定义关联表时,我们需要一些主键来唯一地标识关联表中的记录。拥有主键可创建索引,从而加快连接操作和搜索记录。
那么,为什么将所有外键作为关联表的主要部分?
这是为了确保a
的记录table A
和b
的记录Table B
没有重复的条目。换句话说,为了确保关系的独特性,从而避免重复关系。
可以创建关联表,而无需将外键声明为主键。但这不可取。通过这样做,除非明确创建索引,否则连接操作会变慢。并且,很有可能在Table A
和Table B