파이썬

애플리케이션 설게하기 - PK와 FK

mcdn 2020. 9. 19. 16:45
반응형

파이썬 웹 프로그래밍 pg 106

에 있는 기본 테이블 설계에 나온 예시 분석해보겠다 

 

칼럼명 타입 제약조건 설명
id integer NotNull, PK, AutoIncrement Primary key 
question_text varchar(200) NotNull 질문 문장
pub_date datetime NotNull 질문 생성 시각

Not Null : 모든 칼럼은 Not Null로 정의되어 있기 때문에 칼럼에 값이 있어야 한다. 

PK : primary Key 

Auto Increment : Primary key 를 자동증가 속성으로 지정했다. 

 

칼럼명 타입 제약조건 설명
id integer NotNull, PK, AutoIncrement Primary key 
choice_text varchar(200) NotNull 답변 항목 문구
votes integer NotNull 투표 카운트
question integer NotNull, FK(Question.id), index Foreign key

choices테이블이다. 여기도 id는 primary key 이면서 autoincrement 속성을 가지고 있다. 

qeustion칼럼의 경우 question테이블과 foreign key로 연결하도록 했고 index도 생긴다. 

 

PK Primary key 

- 주 식별자, 주키 등으로 불린다.

- 테이블은 PK또는 FK 둘 중 하나는 꼭 가지고 있어야 한다. 

- PK는 각 행을 고유하게 식별하는 역할을 담당한다. 그래서 하나만 정의 간으하다. 

- 지정된 칼럼에는 중복된 값이나 NULL값이 입력될 수 없다. = NotNULL + UNIQUE

- PK로 지정할만한게 여러개 있을 때 검색이 많이 사용되며 간단한 칼럼으로 지정한다. 

 

https://keep-cool.tistory.com/51

FK foreign key 

- 외부키, 참조키, 외부 식별자 등으로 불린다. 

- FK가 정의된 테이블이 자식 테이블이다. 참조되는 테이블은 부모테이블

(위의 예에서는 choices는 question의 자식테이블이다.)

- 부모테이블이 미리 생성되어 있어야 가능. 

- REFERENCES : 참조할 부모 테이블과 부모테이블에 있는 칼럼을 정의한다. 

- ON DELETE CASCADE : 참조되는 부모테이블의 행에 대한 DELETE를 허용한다. = 부모테이블이 지워지면 같이 지워진다.

- ON DELETE SET NULL : 부모 테이블행이 지워지면 자식테이블의 값은 NULL값으로 설정된다. 

- 데이터 타입이 반드시 일치해야한다. (integer이든)

- 참조되는 칼럼은 PK이거나 UK만 가능하다. (위의 예시에서는 question의 id니까 question.id)

 

 

직접 python으로 테이블을 정의하면 이렇게 된다 

from django.db import models

# Create your models here.

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text


# 테이블 정의한거 
칼럼명 타입 제약조건 설명
id integer NotNull, PK, AutoIncrement Primary key 
question_text varchar(200) NotNull 질문 문장
pub_date datetime NotNull 질문 생성 시각

id의 경우 장고가 자동적으로 만들어주고 

question_text는 max_length 200으로 charfield정의 

pub_date는 datetime타입으로 설정. 

칼럼명 타입 제약조건 설명
id integer NotNull, PK, AutoIncrement Primary key 
choice_text varchar(200) NotNull 답변 항목 문구
votes integer NotNull 투표 카운트
question integer NotNull, FK(Question.id), index Foreign key

choices테이블의 경우에도 

choice_text는 charfield로 

votes는 integerfield

question는 foreign key 함수로 만든다. 

 

 

주의할점 몇개 

- PK는 클래스에 지정해주지 않아도 장고는 항상 PK속성을 자동으로 만들어 준다. 

- DateTimeFIeld() 필드 클래스에 정의한 date published 는 pub_date칼럼에 대한 레이블 문구로 admin에서 이 문구를 보게 된다. 

- FK foreignkey의 경우 다른 테이블 question의 PK와 연결되므로 question 클래스는 id변수까지 지정할 필요 없이 question 클래스만 지정하면 됩니다. 실제 테이블에서 FK로 지정된 칼럼은 _id접미사가 붙는다는 점도 알아 두기. 

- __str__()메소드는 객체를 문자열로 표현할 때 사용되는 함수. admin사이트 등에서 테이블명을 보여줘야 하는데 그때 테이블명이 제대로 표시되도록 하는 것. 

 

반응형