2009-10-26 5 views
14

엔지니어링 회사 용 웹 응용 프로그램을 작성 중입니다. (경고 : 저는 취미로만 프로그래머입니다.)이 문제가 발생할 때까지 장고를 사용할 계획이었습니다. 자연스럽게 사용하고자하는 모델에는 다중 컬럼 기본 키가 있습니다. http://code.djangoproject.com/ticket/373으로, 나는 적어도 릴리스 된 버전이 아닌 장고를 사용할 수 없습니다. 다른 웹 프레임 워크 (Python 기반 만 해당)를 통해 또는 장고의 제한 사항과 함께 작동 할 수 있도록 모델 변경 제안을 통해 문제 해결 방법을 알려주는 사람이 누구인지 알려주시겠습니까? 나는 장고를 배우기위한 기회로 이것을 사용하기를 희망하면서 후자를 정말로 기대하고있다.Django 또는 이와 유사한 복합 기본 키

예 : 표 1에는 part_number 및 part_revision이 기본 키를 구성해야하는 두 개의 필드로 있습니다. P/N은 여러 개정에 존재할 수 있지만 P/N + rev는 고유합니다.

표 2에는 part_number, part_revision 및 dimension_number가 기본 키로 있습니다. 특정 레브의 P/N은 여러 차원을 가질 수 있지만 각각 고유합니다. 또한이 경우 P/N + rev는 표 1의 ForeignKey 여야합니다.

답변

19

해결 방법은 주 키 열로 대리 키 (자동 증가 열)를 만들고 도메인 복합 키에 고유 인덱스를 배치하는 것입니다.

외래 키는 서로 게이트 된 기본 키 열을 나타냅니다.

+1

일을 - 그것에 나를 이길. –

23

일반 기본 키를 추가하고 part_numberpart_revisionunique_together으로 지정하는 이유는 무엇입니까?

이것은 본질적으로 Mitch Wheat이 말한 Djangoish (Djangonic?) 방식입니다.

+0

와우! 이것은 실제로 최상의 솔루션입니다! –

+1

Pythonic에서 유지되는 장수 성 :) – ajay

14

대리 키 사용을 강력히 권장합니다. 그것이 "Djangoesque"이기 때문에가 아닙니다. part_number가 포함 된 복합 키를 사용한다고 가정합니다. 얼마 후 회사가 해당 필드의 형식 (따라서 값)을 변경하기로 결정하면 어떻게됩니까? 또는 일반적인 용어로, 어떤 분야입니까? 기본 키 변경에 대처하고 싶지 않을 것입니다. "실제"값으로 구성된 복합 키를 사용할 때 어떤 이점이 있는지 알지 못하지만, 번거롭지 않은 가치가 있다고 생각합니다. 무의미하고 자동 증가 된 키를 사용하십시오. 그러면 합성 키가 쓸모 없게됩니다.

+4

이것은 많이 수정되어야합니다. 서로 게이트가 더 좋은 아이디어 인 이유에 대한 좋은 기사는 다음과 같습니다. http://www.agiledata.org/essays/keys.html – cethegeek

+0

소프트웨어 업계의 큰 문제는 모든 사람이 주어진 문제를 더 큰 규모로 해결하려고한다는 것입니다. 다른 한편으로는 구조가 변경 될 수도 있고 변경되지 않을 수도있는 미리 정의 된 데이터 세트에 Django를 적용하려고한다면 어떻게 될까요? 더 중요한 것은 장고 자체의 유스 케이스 중 하나 인 "데드 라인을 가진 완벽 주의자를위한 프레임 워크"이다. –

2

SQLAlchemy는 복합 기본 및 외래 키를 지원하므로 모든 SQLAlchemy 기반 프레임 워크 (Pylons 및 Werkzeug가 염두에 둡니다. 그러나 대리 키를 사용하는 것이 더 쉽고 어쨌든 더 잘 지원됩니다.

0

만의 고유 혼합 필드하려면 :

class MyTable(models.Model): 
    class Meta: 
     unique_together = (('key1', 'key2'),) 

    key1 = models.IntegerField() 
    key2 = models.IntegerField() 

하지만 함께 독특한 원하는 열 중 하나가 코드 아래에 비슷한 차 시도 할 수 :

class MyTable(models.Model): 
    class Meta: 
     unique_together = (('key1', 'key2'),) 

    key1 = models.IntegerField(primary_key=True) 
    key2 = models.IntegerField() 
관련 문제