Django - Database Theory

nathan·2021년 7월 18일
0

Django

목록 보기
17/22
post-custom-banner

이번에는 기존에 만들었던 모델(표)를 확장 / 연결을 해보자.


우선 모델 확장 및 연결을 하기 위해 필요한 기초 지식을 배워보자.

데이터베이스란?

  • 어느 한 조직에서 사용되는 응용 프로그램들이 공용할 수 있도록 통합, 저장된 데이터의 집합

  • 가장 중요한 목표 : 중복된 데이터 최소화!

    • 중복된 데이터가 있으면 안되는 이유
      • 데이터가 중복되어 있다면, 중복된 내용이 변경, 삭제될 경우 해당 모든 데이터를 변경, 삭제를 해야합니다. 하지만 그러한 작업은 많은 노력과 시간이 들고, 어떠한 이유로 인해 오류가 발생하면 변경, 삭제가 이루어지지 않아 잘못된 정보가 존재하게 됩니다.
      • 예를 들어, A시스템에서 고객번호 111인 고객의 성명은 '홍길동입니다. B시스템도 마찬가지입니다. 하지만 시간이 흘러 고객번호 111인 사람이 '홍수환'으로 개명신청을 하였다면, A시스템과 B시스템 모두 '홍수환'으로 갱신되어야 할 것입니다. 하지만 데이터의 불일치를 관리하는 장치가 마련되지 않았다면, 옳지 않은 데이터를 담게 되어 DB의 정확성이 떨어지게됩니다.
      • 그래서 데이터베이스는 중복된 데이터를 최소화하는게 가장 중요합니다.

데이터 모델

  • 테이블(릴레이션) 형태로 행과 열로 이루어진 데이터 집합(set)중복이 없다.

테이블의 특성

  • 행의 유일성
    • 위에서 언급했듯이, 테이블은 행들의 집합이며 이는 곧 중복이 없고 유일한 값을 나타낸다는 것입니다.
  • 행의 무순서성
    • 이 또한 집합의 특성입니다. 집합의 원소 사이에는 순서가 없는 것입니다.
    • 파이썬의 set 자료형을 생각하시면 됩니다.
  • 행이 유일하다는 것은 어떤 값을 알면 해당 행을 알 수 있다는 의미입니다.
  • 그리고 그러한 값을 데이터베이스 키라고 합니다. 위의 테이블에서 이름을 알면 그에 맞는 행을 알 수 있겠죠?
  • 예를 들어, '나연묵'이라는 이름(SNAME)을 알고 있다고 가정합시다. 이름(SNAME) 열에서 '나연묵'을 찾으면, 해당 학번, 학년, 학과 등의 모든 내용을 알 수 있습니다.
  • 그러할 때, 이름(SNAME)이 데이터베이스 키입니다.

데이터베이스 키

위에서 보았듯이, 데이터베이스 키는 여러 개의 열 중에 있습니다.

    1. 기본키(Primary Key, pk)
    • 그러한 키들 중, 1개의 행을 유일하게 식별할 수 있는 어떠한 값을 가르켜 기본키라고 합니다.

    • 특징

      • 유일성 : 테이블의 모든 행들에 대해 해당 키 값은 모두 상이하고 유일하다.
      • 최소성 : 행을 구분하는데 최소한의 열만 가지고 있다.
        • 최소성이란? : 기본키 구성이 1개 이상의 열로 이루어질 수 있다는 것입니다. 아래의 테이블에서는 여러 열 중에, (학번, 과목 번호)만 알면 행들을 구별해 낼 수 있습니다.
        • (학번, 과목번호, 성적) / (학번, 과목번호, 중간성적) 등으로도 위의 테이블에서 행을 구분지을 수 있습니다.
        • 하지만 이는 최소성을 만족하지 못해 기본키가 될 수 없습니다.
    • 행의 값을 대표하기에 DB의 기본 접근 방법 → 기본키만 주어지면 언제, 어디서나 해당 값을 통해서 행을 찾아낼 수 있다.

    1. 외래키 (Foreign Key, FK)
    • 두 개의 테이블을 연결시켜주는 다리 역할

      위와 같이 2개의 테이블이 있다고 생각해봅시다. 학생이 어느 과목을 수강하는지 저장할 등록(ENROL) 테이블을 만들려고 합니다. 아래와 같이 만들 수 있을 것 입니다.

      하지만 이는 수많은 데이터 중복을 야기합니다.
      만약 학생(STUDENT)에서 학생의 학년(YEAR)가 바뀌면 등록(ENROL) 테이블의 값들도 모두 바꿔주어야 합니다. 그러면 DB가 추구하는 중복 데이터의 최소화를 달성하지 못하게 됩니다.
      그래서 외래키(Foreign Key)가 도입이 됩니다.
      학생(STUDENT) 테이블의 기본키인 학번(SNO), 과목(COURSE) 테이블의 기본키인 과목번호(CNO)만 있으면 학생이 어떤 과목을 신청했는지 표현할 수 있습니다.

      위와 같이 테이블이 구성되면 중복이 없으며, 등록(ENROL) 관계를 정확히 나타낼 수 있습니다.
      이렇게 어느 하나의 테이블에서 다른 테이블의 기본키가 열에 포함이 된다면, 그 기본키들을 외래키라고 부릅니다.
      등록(ENROL) 테이블에선 학번(SNO), 과목번호(CNO)가 외래키가 되는 것이죠.
      외래키는 곧 다른 테이블의 기본키라고 하였으니, 등록(ENROL) 테이블에서 100번 학생이 누구인지 알고 싶다면 학생(STUDENT) 테이블로 가서 SNO가 100인 행을 찾으면 알 수 있습니다.

관계 타입

위에서 테이블 내부에서 기본키와 외래키의 개념을 보았다면, 이제 테이블 간의 관계를 볼 것입니다.

  1. 일 대 일 (1 :1) 관계
    • 테이블 X, Y의 원소가 각 1개씩 대응이 되는 경우
    • ex) 결혼이라는 관계 → 신랑 / 신부의 두 테이블이 있을 때, 신랑-신부 1명씩 대응
  2. 일 대 다 (1 : n) 관계
    • 테이블 X 1개의 원소가 다른 테이블 Y의 여러 원소에 연결되는 경우
    • ex) 모자(母子)라는 관계 → 어머니 / 아들, 두 테이블이 있을 때, 어머니 1명이 여러 아들과 연결될 수 있음.
  3. 다 대 일 (n : 1) 관계
    • 테이블 X의 각 원소는 최대 1개의 테이블 Y 원소에 연결, but Y의 원소는 n개의 X 원소에 연결
    • ex) 소속이라는 관계 → 교수 / 학과, 교수는 1개의 학과에만 속하지만, 학과에는 여러 교수가 속할 수 있음.
  4. 다 대 다 (n : m) 관계
    • 테이블 X의 각 원소는 n개의 테이블 Y 원소에 연결, Y의 원소는 m개의 X 원소에 연결
    • ex) 등록이라는 관계 → 학생 / 과목, 학생은 여러 과목을 들을 수 있으며, 과목에는 여러 학생들이 등록할 수 있음.
profile
나는 날마다 모든 면에서 점점 더 나아지고 있다.
post-custom-banner

0개의 댓글