[31일차]데이터베이스 설계

유태형·2022년 6월 12일
0

코드스테이츠

목록 보기
31/77

오늘의 목표

  1. 용어 정리
  2. 관계 3가지
  3. 테이블 만들어 보기



내용

용어 정리

데이터 베이스를 설계하기 위해선 먼저 데이터베이스의 구조를 알아보았습니다. 정확히 구조에 각 해당하는 용어들을 알고 있어야 설계시 혼돈이 없을 것입니다.



테이블

테이블 = 릴레이션 : 관계형 데이터베이스에선 데이터를 테이블 형태로 저장합니다.
릴레이션 스키마 : 일정한 형식의 데이터를 도메인으로 구분하여 해당 도메인 범위를 열로 구분합니다. 열들의 집합을 릴레이션 스키마 라고 합니다.
릴레이션 인스턴스 : 릴레이션의 행 1개는 데이터1개 입니다. 데이터들은 각각의 열별로 도메인 범위내의 값들을 가집니다. 데이터들의 집합을 릴레이션 인스턴스라고 합니다.



속성(Attribute) = 열(column) = 필드(field) : 속성 역할을 담당합니다. 속성별 도메인은 같을 수 있지만 속성이름은 서로 상이해야 합니다.
도메인 : 값을 가질 수 있는 범위
차수(degree) : 한 테이블 내의 속성의 갯수 입니다.



레코드(record) = 행(row) = 튜플(Tuple) : 속성의 모임이며 하나의 행은 하나의 데이터 입니다. 레코드들은 서로 같은 속성값을 가질 수 있지만 모든 속성값이 같을 수는 없습니다.
기수(Cardinality) : 한 테이블 내의 데이터의 갯수 입니다.



키(key)

데이터이터 베이스를 설계하는 것은 테이블을 구현하는 것이고 테이블 끼리도 관계가 있을 수 있습니다. 또 테이블내의 레코드간 구분하기 위해 유일성을 가지는 속성에 특수한 기능을 넣어 줄 수도 있습니다.

기본키(Primary Key) : 레코드간 값이 모두 다른 유일성을 보장하는 속성인 후보키중 하나를 선택하여 기본키로 지정합니다. 기본키는 레코드를 구분하는데 사용됩니다. NULL 또는 중복값으로 변경 또는 추가 할 수 없습니다.
외래키(Foreign Key) : 기본키와는 다르게 중복과 NULL을 허용할 수 있습니다. 외래키는 테이블간의 관계를 표현하는데 이용됩니다. 참조 모호성을 피하기 위해 참조하는 테이블의 기본키를 참조하여 테이블간 관계를 정의합니다.




관계 3가지

1:1 관계

1:1 관계는 두 릴레이션 모두 하나의 레코드는 하나의 레코드하고만 관계를 갖는 관계입니다.

A의 1,2,3,4는 각각 b의 1,2,3,4와 하나씩 관계를 맺고 있습니다.(순서는 상관x)

한명의 학생과 한명의 선생은 과외에서 1:1관계입니다.



1:N 관계

1:N 관계는 한쪽 릴레이션의 레코드는 다른쪽의 릴레이션의 레코드 여러개와 관계를 맺지만, 다른쪽 릴레이션의 레코드는 한쪽 릴레이션의 레코드 하나와만 관계를 맺는 관계입니다.

A의 a2는 B의 b1,b2와 A의 a3는 B의 b3,b4와 관계를 맺고 있습니다.(순서,n쪽 갯수 상관x)

강의에서 한명의 선생과 여러명의 학생들은 1:N관계입니다.



N:N 관계

N:M 관계 릴레이션은 양쪽 릴레이션의 레코드들이 반대편 릴레이션의 여러 레코드들과 관계를 맺는 관계입니다.

레코드들의 갯수와 순서는 상관없습니다.

여러명의 선생과 여러명의 학생이 함께하는 조례가 N:N관계입니다.




테이블 만들어 보기

DCL언어를 이용하여 테이블을 만들 수 있고 수정도하고 삭제도 가능합니다. 그중에 CREATE를 이용하여 테이블을 만들어보고 를 이용하여 레코드간의 구분, 다른 테이블을 참조 해보겠습니다.

그 전에 각 열의 데이터 타입 지정은 아래 링크를 참조하는것이 좋습니다.

https://nomadlee.com/mysql-%EC%B5%9C%EC%A0%81%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85-%EC%84%A0%ED%83%9D-%EB%B0%A9%EB%B2%95/

A라는 테이블을 만들어보겠습니다.

CREATE TABLE A(
	afirst int not null primary key auto_increment,
    asecond varchar(20),
    athird Date
);

또는

CREATE TABLE A(
	afirst int not null auto_increment,
    asecond varchar(20),
    athird Date,
    primary key(afirst)
);

afirst, asecond, athird라는 열을 가지는 테이블을 생성합니다. primary key선언을 어디서 하느냐에 따라 위와 아래 두가지 방법이 존재합니다.
not null : null값이 올 수 없음을 지정합니다.
auto_increment : 레코드 삽입시 자동으로 1씩 증가된 값이 저장됩니다.
int : 정수형 데이터 타입
varchar(size) : 가변형 문자열
Date : 날짜형 데이터 타입



A:B = 1:1

CREATE TABLE B(
	bfirst int not null,
    bsecond char(10),
    bthid int,
    PRIMARY KEY(bfirst),
    FOREIGN KEY(bthid) REFERENCES A(afirst)
);

또는

CREATE TABLE A(
	afirst int not null primary key auto_increment,
    asecond varchar(20),
    athird Date,
    FOREIGN KEY(bthid) REFERENCES B(bfirst)
);

1:1관계에선 어느 쪽에서든 참조하는것이 가능합니다. 물론 양쪽 모두 서로 참조하는 것도 가능합니다. 하지만 1:1로 나타낼 수 있는 경우라면 경우에 따라 두 테이블을 합치는 것이 더 나은 성능을 보여 줄 수도 있습니다.



A:B = 1:N

CREATE TABLE B(
	bfirst int not null,
    bsecond char(10),
    bthid int,
    PRIMARY KEY(bfirst),
    FOREIGN KEY(bthid) REFERENCES A(afirst)
);

1:N관계에서는 1쪽에서 외래키 속성에 N쪽의 여러 외래키 값들을 나열하는 것 보다는 N쪽 테이블에서 외래키 속성에 하나의 외래키 값을 저장하는 것이 훨씬 효율적일 것입니다.



A:B = N:N

CREATE TABLE B(
	bfirst int not null,
    bsecond char(10),
    bthid int,
    PRIMARY KEY(bfirst),
);
CREATE TABLE joinTable(
	afirst int not null,
    bfirst int not null,
    ckey int not null primary key,
    FOREIGN KEY(afirst) REFERENCES A(afirst),
    FOREIGN KEY(bfirst) REFERENCES B(bfirst)
);

N:N관계에선 테이블에서 직접 외래키 속성을 추가하는 것보단 두 테이블을 모두 참조하는 조인테이블을 추가하여 관계를 정의합니다. 필요에 따라 조인테이블도 주키(primary key)를 지정할 수 있습니다.




후기

테이블 용어 생성, 테이블간의 관계 정의 등은 꼭 데이터베이스 관리자가 아니어도 백엔드 개발자라면 반드시 알아둬야 합니다. 데이터간의 관계가 어떻게 되는지 어떻게 주고받는지는 알아두는것이 좋습니다.




GitHub

없음!

profile
오늘도 내일도 화이팅!

0개의 댓글