2017-12-27 34 views
0

以下は、sqlalchemyのドキュメントです。SQLAlchemyアソシエーションオブジェクトの外部キーがプライマリキーとしてマークされているのはなぜですか?

お知らせ 最初のForeignKeyとしてマークされた関連クラスでleft_idとright_idのために、彼らがどのようにして、PRIMARY_KEY = Trueの

それは論理的に、彼らはへの外部キーがあるので、彼らは外部キーでなければならないように私には理にかなっています他の2つの親テーブルと子テーブル

これをプライマリキーにする目的は何ですか?

ここでは何が起こっていますか?説明してください。

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の設計方法です。

多対多の関係では、アソシエーションテーブルとも呼ばれる追加のテーブルが必要です。このテーブルは、最初のテーブルのエントリと2番目のテーブルの対応するエントリを対応付けます。

アソシエーションテーブルが定義されている場合、アソシエーションテーブル内のレコードを一意に識別するために、いくつかのプライマリキーが必要です。プライマリキーを持つと、結合操作やレコードの検索を高速化するインデックスが作成されます。

なぜ、すべての外部キーを関連テーブルのプライマリの一部として使用するのですか? これは、レコードatable A、レコードbTable Bの重複エントリがないことを確認するためです。言い換えれば、関係の一意性を保証するために、関係の重複を避ける。

外部キーを主キーとして宣言せずに関連テーブルを作成することができます。しかし、はお勧めできませんです。これにより、索引が明示的に作成されない限り、結合操作が遅くなります。そして、Table ATable Bの間の関係が重複している可能性があります。

関連する問題