ERD 개념 : https://velog.io/@stella_k/ERD

pk와 fk는 뭐고 이것의 상관관계는 무엇인가?

PK(primary key)는 데이터베이스 테이블에서 각 레코드(행)를 고유하게 식별하기 위한 열(속성)

주로 정수 형식의 일련번호로(ID)표현 => 장고를 사용해서 데이타 값을 넣어주면 알아서 id값을 부여해주는데 이때의 예가 될 수 있다.

테이블 내에 중복된 값을 가질 수 없고, NULL값을 가질 수 없다.

즉, 오직 하나만이 pk가 될 수있고, 값이 없어서는 안되는것이 특징이다.
unique=True처럼 다른 고유한 필드값은 있을수 있지만, 고유하다고 해서 PK가 되는것이 아니라는것.

주요 대표가 되는 오직 고유한 PK가 테이블에 한개 존재한다.

예) 사용자 -> 사용자 id번호 사용 => 몇번째 회원으로 가입되었는지. 또는 아이디 중복이 안되니까 말그대로의 유저네임이 pk가 될 수 도 있겠죠?

FK(foreign key)는 한 데이터의 테이블의 열에서 다른 테이블의 PK를 참조하는 열을 말한다.
여기서 ForeignKey는 일대다 관계라고 생각하면된다.

이 FK를 통해 두 테이블의 관계를 설정하고 연결 할 수 있다.

부모테이블(참조되는 PK가 있는 테이블)의 값을 자식 테이블에서(참조하는 테이블) 사용

예) 주문테이블에 사용자테이블의 PK참조하는 FK가 있으면 각 주문이 어떤 사용자에 의해 생성되었는지 추적할 수 있다.

    python

    from user.models import UserModel

    class TweetModel(models.Model):
        class Meta:
            db_table = "tweet"

        author = models.ForeignKey(UserModel, on_delete=models.CASCADE) 
        content = models.CharField(max_length=256)
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
    
    SQL코드


    CREATE TABLE Users (
        user_id INT PRIMARY KEY,
        username VARCHAR(50),
        email VARCHAR(100)
    );

    CREATE TABLE Orders (
        order_id INT PRIMARY KEY,
        user_id INT,  -- FK referencing Users table
        order_date DATE,
        FOREIGN KEY (user_id) REFERENCES Users(user_id)
    );

이런 느낌의 테이블이 생성되는것.

추가적 예시

도서관이라고 생각하고 ERD를 구성한다 생각할때:

  1. 사용자 테이블 :
    각 사용자의 고유한 회원번호 => PK => 다른사용자와 중복 불가
    회원 이름, 나이, 전화번호, 이메일, 주소 등등
  2. 도서 테이블 :
    각 도서는 고유한 ISBN번호를 가진다. => PK
    도서의 제목, 작가 ,출판사
  3. 대출 테이블:
    각 대출건 마다 고유한 대출 번호 => PK
    대출한 도서의 번호와 사용자의 회원 번호를 저장 => 도서번호, 사용자 회원번호 =>FK 사용
    대출 날짜, 반납날짜, 연체체크 등

여기서 보면 사용자 - 도서 테이블은 N:N의 관계이다.
그럼 대출테이블은 뭐냐? 바로 FK사용으로 두 테이블의 관계를 이어주는 브릿지 테이블의 역할을 하고 있다고 보면 된다. 더 효과적으로 관리하기 위한 테이블이다.

profile
초보개발자

0개의 댓글