2017-12-27 304 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之間的關係