[데이터베이스 & SQL 첫걸음] 11주차 공부

김서영·2021년 11월 28일
0

테이블 설계의 기초

집합과 함수를 살펴보자

테이블 설계의 기초

데이터를 관리하는 그릇, 테이블

관계형 데이터에서 데이터를 관리하고 저장하기 위한 그릇은 '테이블'뿐이고, 다른 곳은 없음. 결국, 관계형 데이터베이스에서는 '전체 데이터가 테이블에 포함되고 저장됨'.

관계형 데이터베이스가 주류가 된 이유

데이터의 정합성을 높이기 위한 '설계 노하우'가 매우 발달.

테이블 설계는 논리의 세계

테이블 설계를 '논리 설계'란 말로 부르는 경우가 있음. 시스템에서 하드웨어의 세계를 '물리', 소프트웨어의 세계를 '논리'라 부름.
테이블 설계는 서버나 스토리지 같은 물리층과 관계없이 독립적으로 작성하는 것이 가능해서 '논리의 세계에서 결정된다'라고 간주.

테이블이란

관계형 데이터베이스에서 테이블이란 2차원 표와 거의 같음. 형식적으로 행과 열을 가지고 테이블은 공통적인 요소의 집합임.

테이블은 공통 속성을 가진 것의 집합이다

테이블 설계의 제1 규칙,어떤 공통의 속성을 가진 것의 집합.
테이블명은 반드시 복수형이나 집합명사로 표현.

테이블은 현실 세계를 반영한다

관계형 데이터베이스의 테이블에도 사람이 만든 개념이나 집합에 대응하는 형식으로 존재해야 함.

테이블 설계 규칙

테이블 설계는 간단하다?

'테이블은 현실 세계의 개념이나 집합을 나타낸 것'이라는 규칙에 충실하기만 하다면 어려울 게 없음. 절대로 해서는 안되는 설계 패턴(안티 패턴)이 있긴 함.

사물과 사물의 집합은 계층이 다르다

같은 테이블을 만들더라도 집합을 나누는 방법(또는 정리하는 방법)에 따라 테이블을 나누는 방법이 거의 무한으로 존재.
이처럼 테이블의 구성 패턴은 자의적인 구분을 고려한다면 얼마든지 늘릴 수 있음. 이것이 데이터베이스 테이블 설계의 어려움임.
'인간 인식을 반영한다'란 것은 무절제한 자유도와 패턴을 허용하는 것.

가장 상위의 개념집합으로 정리한다

가장 상위의 개념집합으로 정리.
SQL 문의 WHERE 절로 열을 제어하면 간단하게 구현.

열이란 개체의 속성이다

객체지향 언어에 비유를 해보자면,
테이블은 메소드를 뺀 클래스
열은 속성, attribute
행은 인스턴스

현실 세계에 같은 사람은 2명 있지 않다

테이블의 설계 원칙의 하나 '반드시 기본키를 설정할 것'
한 개 테이블의 내용에는 중복 행을 허용하지 않음.

기본키 할당은 관리의 기본

데이터베이스 사용 여부와 관계없이 데이터를 고유하게 식별할 수 있는 기본키(ID, Identifier)를 할당하는 것은 데이터 관리의 기본.

기본키는 중복되면 안 된다

기본키로 사용하는 열은 중복이 발생하지 않는 값을 할당해야 함.

기본키의 값이 바뀌면 왜 곤란한가

  • 변경 후 값의 유일성을 보증할 수 없음.
  • 과거 데이터와의 결합(매칭)이 어려움.
    테이블 설계는 데이터가 정적이지 않고 동적임.

기본키 열로 NULL은 불가

데이터베이스 객체 작성과 삭제

데이터베이스 객체

데이터베이스 객체

테이블이나 뷰, 인덱스 등 데이터베이스 내에 정의하는 모든 것.
객체는 데이터베이스 내에 실체를 가지는 어떤 것. 대표적으로 테이블.
객체는 이름을 가짐. 따라서, 객체 간 이름이 겹치지 않도록 해야함.
객체 이외에도 테이블의 열 또한 이름을 가짐.

이름을 붙일 때 제약 사항 (명명규칙)

  • 기존 이름이나 예약어와 중복 X
  • 숫자로 시작 X
  • 언더스코어(_) 이외의 기호는 사용 X
  • 한글을 사용할 때는 더블쿼트(MySQL에서는 백쿼트)로 둘러쌈
  • 시스템이 허용하는 길이 초과 X
  • 의미없는 이름 X

스키마

데이터베이스 객체는 스키마라는 그릇 안에 만들어짐. 따라서, 객체의 이름이 같아도 스키마가 서로 다르면 상관없음.
CREATE DATABASE 명령으로 작성한 '데이터베이스'가 스키마가 됨.

테이블과 스키마는 무언가를 담는 그릇 역할을 한다는 점에서 비슷.
이름이 충돌하지 않도록 기능하는 그릇을 '네임스페이스(namespace)'.

테이블 작성, 삭제, 변경

CREATE TABLE 테이블명 (열 정의1, 열 정의2, ...)
DROP TABLE 테이블명
ALTER TABLE 테이블명 하부명령

DML - SELECT, INSERT, DELETE, UPDATE
DDL은 데이터를 정의하는 명령, 스키마 내의 객체를 관리할 때 사용.

테이블 작성

DDL은 모두 같은 문법을 사용.
CREATE로 작성, DROP으로 삭제, ALTER로 변경.

CREATE TABLE 테이블명 (열 정의1, 열 정의2, ...)
자료형은 INTEGER나 VARCHAR 등을 지정. 특히 CHAR나 VARCHAR와 같은 문자열형으로 지정할 때는 최대길이를 괄호로 묶음.

기본값을 설정할 때는 DEFAULT로 지정하되 자료형에 맞는 리터럴로 기술.(생략 가능)

열이 NULL을 허용할 것인지를 지정. NULL을 명시적으로 지정하거나 생략했을 경우는 NULL을 허용.

열명 자료형 [DEFAULT 기본값] [NULL|NOT NULL]

테이블 삭제

DROP TABLE 테이블명
데이터베이스에서 테이블을 삭제. 테이블에 저장된 데이터도 함께 삭제.

DELETE TABLE 테이블명
테이블 정의는 그대로 둔 채 데이터만 삭제. WHERE 조건을 지정하지 않으면 테이블의 모든 행을 삭제. 행 단위로 여러 가지 내부처리가 일어나므로 삭제할 행이 많으면 처리속도가 느림.

TRUNCATE TABLE 테이블명
삭제할 행을 지정할 수 없고 WHERE구를 지정할 수 없음. 모든 행을 삭제해야할 때 빠른 속도로 삭제 가능.

테이블 변경

ALTER TABLE 테이블명 변경명령
열을 추가하거나 데이터 최대길이를 변경하는 등 구성을 바꿔야하는 경우에 ALTER TABLE 명령을 사용하면 테이블에 저장되어 있는 데이터는 그대로 남긴 채 구성만 변경 가능.

  • 열 추가/삭제/변경
  • 제약 추가/삭제

열 추가

ALTER TABLE 테이블명 ADD 열 정의
기존 데이터 행이 존재하면 추가한 열의 값이 모두 NULL이 됨.
NOT NULL 제약을 붙인 열을 추가하고 싶다면 먼저 NOT NULL로 제약을 건 뒤에 NULL 이외의 값으로 기본값을 지정.

열 속성 변경

ALTER TABLE 테이블명 MODIFY 열 정의
열 이름은 변경할 수 없지만, 자료형이나 기본값, NOT NULL 제약 등의 속성은 변경 가능.

열 이름 변경

ALTER TABLE 테이블명 CHANGE [기존 열 이름][신규 열 정의]
열 이름뿐만 아니라 열 속성도 변경할 수 있음.
Oracle에서는 열 이름을 변경할 경우 RENAME TO 하부명령을 사용.

열 삭제

ALTER TABLE 테이블명 DROP 열명

ALTER TABLE로 테이블 관리

최대길이 연장

시스템을 운용하다 보면 처음에는 한 자리로 충분했던 용량이 시간이 지나면서 부족해질 수 있음.
특히 문자열형의 경우 최대길이를 지정하는데, 이 최대길이를 ALTER TABLE로 늘릴 수 있음.
ALTER TABLE 테이블명 MODIFY [열 이름] varchar(30)

반대로 저장공간을 늘리기 위해 최대길이를 줄이고 싶은 경우도 있음. 이때는 여러 가지 문제가 발생. 기존의 행에 존재하는 데이터의 길이보다 작게 지정할 수 없음.

열 추가

ALTER TABLE 테이블명 ADD [새로운 열 이름] INTEGER
보통 열을 추가하는 정도로는 시스템 쪽에 미치는 영향이 적을 것 같지만, 테이블 정의가 바뀌어버리는 일인 만큼 꽤 영향을 줌.
적어도, 변경한 테이블에 행을 추가하는 INSERT 명령은 확인해야 함. 열을 추가하면 해당 열에 대해 데이터 값을 지정해야 하기 때문.

제약

테이블 작성시 제약 정의

제약은 테이블에 설정하는 것.
CREATE TABLE로 테이블을 작성할 때 제약을 같이 정의.

  • 열에 대해 정의하는 제약 - 열 제약
    NOT NULL / UNIQUE
  • 복수열에 의한 기본키 제약(한 개의 제약으로 복수의 열에 제약) - 테이블 제약

제약에 이름을 붙이면 나중에 관리하기 쉬워짐.
CONSTRAINT 키워드로 지정.

제약 추가

열 제약 추가

ALTER TABLE sample61 MODIFY c VARCHAR(30) NOT NULL;

테이블 제약 추가

ALTER TABLE sample61 ADD CONSTRAINT pkey_sample61 PRIMARY KEY(a);

제약 삭제

c열의 NOT NULL 제약 없애기

ALTER TABLE sample61 MODIFY c VARCHAR(30);

pkey_sample61 제약 삭제하기

ALTER TABLE sample61 DROP CONSTRAINT pkey_sample61;

기본키 제약 삭제하기

ALTER TABLE sample61 DROP PRIMARY KEY;

기본키

기본키는 테이블의 행 한 개를 특정할 수 있는 검색키.
기본키 제약이 설정된 테이블에서는 기본키로 검색했을 때 복수의 행이 일치하는 데이터를 작성할 수 없음.

복수의 열로 기본키 구성하기

기본키 제약에는 이를 구성할 열 지정이 필요하고, 이때 지정된 열은 NOT NULL 제약이 설정되어 있어야 함. 즉, 기본키로는 NULL값이 허용되지 않음.

profile
하지만 저는 이겨냅니다. 김서영이죠?

0개의 댓글