2017-12-27 51 views
0

다음은 sqlalchemy의 설명서입니다.SQLAlchemy 연결 개체의 외래 키가 기본 키로 표시되는 이유는 무엇입니까?

주의 첫 외래 키로 표시 협회 클래스에서 left_id 및 right_id을 위해, 그들이하는 방법을 다음 primary_key와 = 진정한

그것은 논리적으로는 외국 키이기 때문에 그들이 외래 키를해야한다고 나에게 의미가 있습니다 다른 두 개의 상위 W 하위 테이블.

그래서 기본 키가되는 목적은 무엇입니까?

무슨 일이 벌어지고 있니? 설명 해주십시오.

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의 설계 방법입니다.

다 대다 관계에서 연관 테이블이라고도하는 추가 테이블이 필요합니다.이 테이블은 첫 번째 테이블의 항목과 두 번째 테이블의 해당 항목을 매핑합니다.

연관 테이블이 정의되면 연관 테이블의 레코드를 고유하게 식별하는 기본 키가 필요합니다. 기본 키를 가짐으로써 조인 작업과 레코드 검색 속도가 빨라집니다.

그럼 외래 키를 연관 테이블의 기본 키로 사용하는 이유는 무엇입니까? 의 중복 항목이 table A이고 bTable B 인 레코드가 없는지 확인하십시오. 즉, 관계의 고유성을 보장하기 위해 관계의 중복을 피하십시오.

외래 키를 기본 키로 선언하지 않고도 연관 테이블을 만들 수 있습니다. 하지만 은 바람직하지 않습니다.입니다. 이렇게하면 인덱스가 명시 적으로 만들어지지 않으면 조인 작업이 느려집니다. 그리고 관계의 중복 기록이있는 좋은 기회가 있습니다 Table ATable B