2011-01-28 5 views
1

나는 사람 모델 장고 모델이 있습니다,장고 데이터베이스 설계 - 널 Forign 키

는 "middle_name"필드가 Null을 허용
class Person(models.Model): 
    # Personal details 
    first_name = models.CharField(max_length=50) 
    middle_name = models.CharField(max_length=50, blank=True, null=True) 
    last_name = models.CharField(max_length=50) 
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES) 
    date_of_birth = models.DateField() 

    # Address 
    street_address = models.CharField(max_length=50) 
    suburb = models.CharField(max_length=30) 
    postcode = models.CharField(max_length=4) 
    state = models.CharField(max_length=3, choices=STATE_CHOICES) 

    #Contact Details 
    email = models.EmailField() 

    # Family 
    spouse = models.ForeignKey('self', null=True, blank=True) 
    children = models.ManyToManyField('self', null=True, blank=True) 

    home_church = models.ForeignKey('Church', null=True, blank=True) 

, 나는이를 방지 할 수있는 방법이 있다고 생각하지 않습니다 있는가?

그러나 배우자에 대해 nullable ForeignKey, 자녀에 대해 재귀 ManyToManyField 및 교회에 대한 nullable ForeignKey (해당되는 경우)가 있습니다.

제 질문 - 우선 null 허용 외래 키에 대한 현재 합의는 무엇입니까? 제가 여기서 허용해야합니까, 아니면 배우자/가정 교회가없는 것을 나타내는 "아무도 없음"또는 "지정되지 않은"모델을 만들어야합니까?

아니면 다른 방법으로 장고에서이 디자인을 수정하여이 문제를 해결할 수 있습니까?

그리고 내가 FK를 null로 진행한다면, 장고에주의해야 할 사항이 있습니까? (왼쪽 가입?)

건배,

+0

내 2 센트 만 허용되지만 nullable 외래 키는 완벽하고 대부분 사실상 필수 불가결하다고 생각합니다. 장고는 내가 생각할 수있는 경고가 없으며 ORM이 문제를 잘 처리 할 것입니다. – Mikesname

+0

+1 Mikesname에 대해 –

답변

0

널 완벽하게 괜찮 빅터. 파이썬 코드 None에서 Null을 나타냅니다.

당신이 알아야 할 중요한 한 가지는 교회를 지우면 django가 계단식으로 실행되고 그 교회의 사람도 삭제된다는 것입니다. 그래서 교회를 삭제하기 전에 그 교회에있는 모든 사람을 위해 교회 필드에 Null을 설정해야합니다.

장고 1.3은이 부분을 훨씬 더 단순하게 만드는 on_delete 인수를 도입했습니다.

0

대부분의 DBMS에 의해 구현 된 Nullable 외래 키는별로 논리적으로 이해하지 못합니다. 또한 다른 DBMS가 처리하는 방식간에 약간의 불일치가 있습니다. 따라서 nullable 외래 키가 잘못된 결과를 초래할 가능성이 큽니다. 문제의 애트리뷰트를 새 테이블로 옮기고 값을 채울 값이있을 때만 해당 테이블을 채우기 만하면 쉽게 피할 수 있습니다.

0

외래 키가 null = True로 표시되면 Django는 LEFT OUTER JOIN이 아닌 Oracle 데이터베이스 AFAIK가있는 JOIN을 처리하므로 아무 문제가 없습니다.