2011-08-03 1 views
1

나는 모든 테이블에 기본 키 열이 있어야 장고의 ORM을 사용하면 사실을 알고 있습니다.django (python)에 대한 MySQL 테이블에서 중복되는 기본 키 열을 피할 수 있습니까?

id  author_id  book_id 
1  1    1 
2  1    2 
3  2    3 
etc. 

내가이 열 "ID"를 방지하기 위해 제안하는 책을 발견하고있다 : 당신이 테이블로 연결되는 many_to_many 테이블이 어떻게 든 경우에 당신이 뭔가를 얻을 것 (의 그들 저자와 책을 부르 자) 대신에 복합 기본 키를 작성하십시오. 이것은 장고와 함께 작동합니까?

+0

내가 /에 대한 인수에 관심이 있으십니까? 문서가 어디에 있습니까? – Sonny

+1

링크 테이블의 경우 직접 액세스하지 않아도됩니다. Django의 ManyToManyField를 사용하여 'through'매개 변수를 사용하는 링크 테이블 참조 : https://docs.djangoproject.com/en/dev/topics/db/models/#many-to-many-relat ionhips –

+1

@ Sonny : 나는 * article *과 * book *을 썼다. 그 제목은 ** SQL Antipatterns : ** Bill Karwin **이 작성한 데이터베이스 프로그래밍의 함정 피하기 **입니다. 만약 당신이 (위의 예제에서)'author_id'와'book_id'에 복합적 유일 제약을 두어야 만한다면 그는 말합니다. 그렇게하면 복합 키는 'id' 열과 동일한 속성을 갖게됩니다. 그래서 그것은 중복됩니다. 통로는 길고 훨씬 더 많은 논쟁이 있습니다. 그러나 이것이 틀린 것이 아니라면 이것이 그 본질이라고 생각합니다. :-) – Aufwind

답변

2

통역 테이블에 복합 기본 키를 만들 수 있습니다 (ALTER TABLE 사용). 테이블에서 id 열을 삭제할 수도 있습니다. 이것은 ManyToMany 필드가 백엔드에서 작동하여 ID 열을 사용하지 않는 방식으로 장고를 손상시키지 않습니다.

그러나 장고에서 작동하도록 복합 PK를 얻는 것은 기본적으로 비 시동기입니다. 어떤 테이블도 당신의 테이블을 통해 외래 키를 가질 수 없기 때문에 문제가되지 않습니다. (적어도 내가 생각할 수있는 어떤 이유로 든.)

요약하면 복합 기본 키는 django에서 작동하지 않습니다. 그래서 Compound PK를 가진 테이블에 ForeignKey를 가지고 있어야한다면 기본적으로 SOL입니다. 마지막으로 여기에 복합 PK를 사용하는 것에 대한 진정한 프로는 없지만 실제 죄는 없습니다 (이 경우와 유일한 경우).

+0

나는 저자의 생각을 이해하고 이적 행위에 대한 지식을 소비하려고 노력하고있다. 여기서는 아무런 생산성이 없습니다. 그건 그렇고, SOL *이 의미하는 것은 무엇입니까? – Aufwind

+0

SOL : http://www.urbandictionary.com/define.php?term=sol – Sonny

+0

저자의 논거는 중복 고유 제한 조건을 생성하면 결국이 테이블 대신 두 개의 인덱스를 작성하게된다는 것입니다. 소량의 쓰기 오버 헤드가 추가됩니다. 그리고 id에 대한 인덱스를 없애는 것은 결코 사용되지 않을 것입니다. 이 경우에는 장고와 함께 화합물 pk를 만드는 것이 안전 할 수 있지만이 경험을 기본적으로 다른 관계로 확장 할 수는 없습니다 – John

관련 문제