1. Database의 개념 |
1) 용어 정리
- Data : 의미를 가지면서 기록될 수 있는 알려진 사실
- DB : 특정 소프트웨어나 프로그램에 종속되지 않고 독립된 정보(관련있는 데이터) 저장소
- DBMS : DB 생성과 관리를 담당하는 소프트웨어 패키지
흔히 말하는 데이터베이스가 DBMS를 의미
DB는 그냥 창고의 개념이고 정보를 넣고 빼고 하는 장소의 개념이고
DBMS는 그 원하는 정보를 찾아서 빼는 자판기같은 역할
- RDBMS : 관계형 데이터베이스 관리 시스템(Relational Database Management System)
- DBS : 데이터베이스 시스템(DB, 하드웨어, 소프트웨어, 유저 모두를 포함해서 칭하는 용어)
- 작은 세계(mini world) : 데이터베이스 구축의 대상이 되는 실세계의 일부분
- SQL : DBMS에서 사용자가 원하는 기능(삽입 삭제 수정 등)을 하기 위해 사용하는 언어
즉 DBMS라는 자판기의 버튼같은 느낌
[에스큐엘]이라고 발음하기도 하고 편하게 Sequel[시퀄]이라고 발음하기도 함
- 데이터베이스 관리자(database administrator, DBA) : 데이터베이스 관리자(시스템의 관리를 책임진 사람)
- 데이터베이스 설계자(database designer) : db설계를 책임진 사람
- 최종 사용자(end users) : db에 질의, 갱신, 보고서작성등을 하는 사람
- 시스템분석가/응용프로그래머 : 초보사용자를 위해 잘 정의된 응용프로그램을 설계하고 구현하는 사람
2) 데이터베이스의 특징
- 데이터베이스를 사용하는 이점
- 여러 부서에서 각각의 데이터를 보관하고 처리하는 노력을 할 필요 없이 하나의 데이터저장소만 유지하며 여러 사용자에 의해 공유하고 사용가능
- 자기기술성(self describing)
- 카탈로그에 메타데이터(데이터베이스에 대한 정보)가 저장
- 이를 이용하여 하나의 DBMS가 다수의 데이터베이스 관리
- 프로그램과 데이터의 분리 및 데이터 추상화
- DB내의 저장구조가 변경되어도 응용프로그램은 영향을 받지 않음(독립성)
- 데이터에 대한 다양한 뷰 제공
- 저장 구조의 자세한 내용은 사용자에게 은닉하고, 사용자가 관심있어하는 데이터베이스의 일부분을 뷰로 제공
- 데이터 공유와 여러 사용자 트랜잭션 처리
- 동시성을 제어하며 온라인트랜잭션처리(고립성, 원자성)
3) 데이터베이스의 사용효과
- 표준화된 데이터 관리(효율성 증대)
- 데이터 구조 변경에 융통성 부여(독립성으로 인해 구조변경해도 사용자측에선 영향없음)
- 응용프로그램 개발시간 단축(대부분을 DBMS가 처리해주니까)
- 항상 최신정보를 제공(한사람이 갱신하면 나머지사람들도 즉시 변경된 정보 접근 가능)
- 규모의 경제성(부서마다 관리하는것보다 통합DB로 관리하니 전체적으로 저비용)
4) 3 스키마 구조
- 외부단계 / 개념단계 / 내부단계
- 외부단계
- 외부 스키마로 사용자의 데이터타입(뷰)를 제공
- 프로그램이 사용하는 모든 데이터타입을 제공해주며, 특정 사용자가 사용하는 데이터를 제외한 나머지는 은폐
- 개념단계
- 모든 사용자를 위한 데이터베이스 구조
- 어떤 항목들로 구성되는지 관심을 가져서 엔터티, 데이터타입, 릴레이션쉽, 사용자연산, 제약조건에 중점
- 물리적 저장구조에 대해서는 은폐
- 내부단계
- 물리적 모델을 사용하여 데이터가 어떤 편성으로 저장되는지 관심
- 데이터 저장구조의 세부사항과 접근경로를 기술
- 무슨말이냐면 실제 데이터는 물리적단계에만 존재하지만, 나머지 단계에서 변환을 해서 사용자가 볼 수 있게 하는 것
- 프로그램이 외부스키마를 이용해 데이터를 요구하면 외부스키마에선 해당 데이터가 존재하는 개념스키마에 데이터를 요구하고, 개념스키마는 내부단계에 데이터를 요구하며, 내부쪽에서 저장장치에서 읽어서 개념으로 전달, 개념에서 외부로 전달, 외부에서 데이터베이스를 데이터로 변환 후 프로그램으로 전달, 프로그램이 데이터를 사용하는 형식
5) DBMS의 기능
- 정의, 생성, 조작
- 정의 : 데이터타입, 데이터구조, 제약조건들에 대한 정의
- 생성 : 특정의 데이터를 저장장치에 효과적으로 저장
- 조작 : 질의, 갱신, 데이터에 대한 보고서작성
- 데이터 중복의 최소화 및 통제된 데이터 중복성 제어(데이터 일치성 보장 및 메모리낭비 방지)
- 동시성 제어(다 사용자간의 데이터의 공유 및 동시접근 보장)
- 보안기능(권한이 없는 사용자의 접근 통제)
- 다양한 사용자 인터페이스 제공(복잡한 릴레이션쉽을 쉽게 표현)
- 데이터베이스의 무결성 보장(백업과 복구기능 제공)
2. 관계형 Database의 개념 |
- 데이터베이스를 릴레이션들의 집합으로 표현
- 데이터가 표형태의 릴레이션(테이블)에 저장
- 관계형 데이터베이스가 아닌 데이터베이스들도 있지만 이 DB들은 처리 방식이 다 제각각이라 그냥 noSQL 혹은 non-RDB라고 부름
- 관계형 데이터베이스는 보통 작은 프로그램이나 개인용은 mySQL을 사용, 큰 규모의 기업체수준은 Oracle을 사용
1) 릴레이션
- 값들의 테이블
- 릴레이션 스키마와 행들의 집합으로 이루어짐
- 릴레이션 스키마란 릴레이션의 이름과, 애트리뷰트들의 이름
※ 행 : row / 열 : column / 데이터 행 : 튜플 / 테이블 : 릴레이션
2) 릴레이션의 특성
- 튜플들의 집합(릴레이션)에서 튜플들의 순서는 중요하지 않음(저장은 특정 순서대로 되긴 하지만 무의미)
- 한 튜플 내의 값들은 애트리뷰트의 순서에 의해 결정, 애트리뷰트와 대응하는 값을 알 수 있으면 순서는 중요하지 않음
- 하지만 한 튜플 내의 값들이 애트리뷰트와 대응관계를 모르면 값들의 순서가 애트리뷰트들의 순서에 대응
3) 릴레이션 상태
- 동적인 것
- 실제로 값이 들어간 상태, 튜플들의 집합
- 릴레이션 인스턴스, 릴레이션 어커런스 라고도 부름
- 연산에 의해 상태가 변함 - 삽입 / 삭제 / 수정
- r(R)로 표시 : r은 릴레이션상태, R은 릴레이션 스키마
4) 릴레이션 스키마
- 정적인것
- 릴레이션의이름(애트리뷰트1, 애트리뷰트2, 애트리뷰트3, ...)으로 표현
5) 관계형 데이터베이스의 스키마
- 데이터베이스 스키마 전체의 이름과 그 데이터베이스 내의 릴레이션 스키마들의 이름
- Company = {Employee, Department, DeptLocations, Project, WorksOn, Dependent}
6) 도메인
- 유효한 값들의 집합
- 애트리뷰트 A에 대응하는 도메인 dom(A)
- 더 이상 분해되지 않는 값들의 집합
- 특정의 데이터타입이나 포맷으로 지정(전화번호면 ddd-dddd, 주민등록번호면 yymmdd-sddddsc, 날짜면 표기법에 따라 다양하게)
- 애트리뷰트 이름은 같은 도메인을 가지는 서로 다른 애트리뷰트라도 의미를 명확하게 해줌(청구일 애트리뷰트와 지불일 애트리뷰트)
7) 튜플
- 튜플은 순서에 의한 값들의 모임
- 구성되는 값은 대응하는 도메인 중의 하나의 값
- t = <"홍길동", 15, "개발팀", 5> 이런식이면 4개의 값으로 구성된 4-tuple
- 이 튜플이 해당 릴레이션의 실제 한 엔터티인 것
- 릴레이션은 이런 튜플들의 집합인것
8) 릴레이션의 제약조건
- 아래 4번주제 제약조건에서 자세히 설명함
① 도메인 제약
② 키 제약
③ 엔터티 무결성 제약
④ 참조 무결성 제약
⑤ 함수적 종속 제약
⑥ 기타 제약조건
9) 변경연산자의 제약(INSERT/DELETE/UPDATE시 주의할 것)
- 변경시 제약조건을 위반해서는 안됨
- 여러 변경이 그룹으로 함께 적용되기도 함
- 변경연산으로 인해 다른 수정이 야기될수 있음(무결성 제약조건을 유지하기 위해 다른 변경이 생기게 될수도 있다거나 참조되고있는 기본키가 변경되면 외래키가 변경될수도)
① Insert
- 도메인, 키, 엔터티무결성, 참조무결성 4가지 제약조건 위반 가능
② Delete
- 참조무결성 위반 가능
- RESTRICT(연산 거절), CASCADE(참조하는 모든 튜플 연쇄적으로 삭제), SET NULL(참조하는 외래키를 NULL로 설정) 조취를 취할 수 있음
③ Update
- 도메인, 키, 엔터티무결성, 참조무결성 4가지 제약조건 위반 가능
- 삭제 후 삽입연산과 동일하므로 해당 상황에서 발생하는 제약조건 위반 가능
3. 관계형 Database만드는 과정 |
3-1) 사용자가 원하는 것을 파악
3-2) ERD 그리기
3-3) 관계형 모델로 사상하기
3-4) 정규화
3-5) DDL로 스키마, 테이블 등 만들고, DML로 데이터 채워넣기
3-1) 사용자가 원하는 것을 파악 |
1) 향후 데이터베이스 사용자와 인터뷰 및 업무처리 파악
2) 데이터 요구 조건(데이터 타입)을 파악하여 문서화
3) 응용 프로그램에서 업무처리에 필요한 기능들의 요구조건 명시
4) 데이터베이스에 적용할 연산자 명시
5) 데이터베이스에 대한 개념적 스키마 설계
3-2) ERD 그리기 |
1) ER 모델의 개념
- 엔터티와 릴레이션쉽
- 엔터티에는 애트리뷰트, 릴레이션쉽에는 참여와 카디널리티
2) 데이터베이스 응용프로그램이 하는 것
- 질의 : 정보 검색
- 갱신 : 최신의 정보로 유지
3) 애트리뷰트 타입
- 단순과 복합
- 단순 애트리뷰트는 그냥 하나의 애트리뷰트
- 복합 애트리뷰트를 예로 들면 주소에서 도, 시, 동, 도로명주소 등으로 분해되는 것
- 단일값과 다중값
- 애트리뷰트는 일반적으로 하나의 값을 가지지만, 여러 값을 가질 경우도 있음
- 단일값은 일반적인 하나의 애트리뷰트
- 다중값은 타원을 이중선으로 표시하며 대학학위가 복수전공이라거나, 색깔이 믹스컬러이거나
- () : 애트리뷰트들이 쉼표로 구분되어 하나로 그룹화
- {} : 다중값
- 한 주소에 전화기가 여렇이라면 {AddressPhone({Phone}, Address)}이고 Phone(AreaCode, PhoneNumber)이며 Address(StreetAddress(Number, Street, AptmentNumber), City, State, Zip) 이런 식으로 표기
- 저장과 유도
- 저장값은 일반적으로 저장된 값
- 유도된 애트리뷰트란 저장되어 있는 값을 이용해서 알아낼 수 있는 것이며 점선 타원으로 표시
- 예를 들어 생년월일이 저장되어 있으면 나이를 알 수 있는 것
- 한 부서의 사원의 수도 유도될 수 있음
4) 키 애트리뷰트
- ERD 그릴때는 키 애트리뷰트에는 밑줄 표시
- 애트리뷰트 값이 엔터티 집합에서 유일성/식별성을 가져서 각 엔터티를 유일하게 식별
- 여러개가 모여서 키를 형성하면 해당 복합애트리뷰트에 밑줄, 여러 애트리뷰트가 다 키로 쓰인다면 각 애트리뷰트 밑줄
5) 도메인
- 애트리뷰트가 가질 수 있는 특정 값들의 집합
- 예를들어 나이는 16세에서 70세까지만 가능하다면 16~70이 도메인인것
- 구현으로는 integer, float, Boolean, string이나 Date, Time등 추가적 데이터타입을 사용
6) 릴레이션쉽
- 엔터티사이의 관계
- ERD에서 마름모로 표시
- 릴레이션쉽의 차수란 참여하는 엔터티 타입의 갯수이며 대부분 이진릴레이션쉽타입으로 두 엔터티가 참여
7) 순환 릴레이션쉽 타입
- 한 엔터티 타입이 릴레이션쉽에 두번 이상 참여(사원들의 상사관계)
8) 참여와 카디널리티
- 참여는 전체참여와 부분참여
- 전체참여란 모든 엔터티가 릴레이션쉽에 참여하는 것, 두줄로 표시
- 부분참여는 참여 할수도 아닐수도, 한줄로 표시
- 카디널리티는 1:1, 1:n, M:n
- 하나의 부서에 최고책임자가 한명인 경우 1:1
- 하나의 부서에 속한 사원이 여러명일 경우 1:n
- 여러 사원이 여러 프로젝트를 수행 할 경우 m:n
9) 릴레이션쉽 타입의 애트리뷰트
- 릴레이션쉽을 설명하는 애트리뷰트도 있을 수 있음
- 마름모에 애트리뷰트(타원)을 표시
10) 약한 엔터티 타입
- 다른 엔터티 타입의 존재 여부에 따라 존재가 결정
- 어떤 엔티티와 관계를 맺어야 존재할 수 있음
- 항상 전체참여
- 자체적으로 키를 가질 수 없고 어떤 엔터티를 통해서만 찾을 수 있음
- ERD에서 부분키는 점선밑줄로 표시
- ERD에서 이중 사각형으로 표시
- 약한 관계는 이중 마름모로 표시
- 예를들어 사원의 부양가족을 저장하고 싶을때 사원엔터티와 부양가족엔터티가 관계를 맺어야만 존재(사원키와 부양가족키를 같이 써야 확인 가능)
3-3) 관계형 모델로 사상하기 |
- 엔터티(강,약), 이진관계(1:1, 1:N, M:N), 애트리뷰트(단순,복합,다중값)을 이용
- ER에서 관계로 사상하는 알고리즘 순서
step 1 : 정규 엔터티 타입 사상
step 2 : 약한 엔터티 타입 사상
step 3 : 1:1 이진관계 타입 사상
step 4 : 1:N 이진관계 타입 사상
step 5 : M:N 이진관계 타입 사상
step 6 : 다중값 애트리뷰트 사상
step 7 : N-ary 관계 타입 사상
1) Step 1 : 정규 엔터티 타입 사상
- 엔터티에 대한 릴레이션 R을 생성
- R에 엔터티의 모든 단순 애트리뷰트를 포함
- 그 후 모든 복합 에트리뷰트의 구성요소 포함
- 키애트리뷰트중 하나를 R의 기본키로 선택(선택된 키가 복합애트리뷰트이면 구성요소들 전체가 기본키)
- Employee(FName, MInit, LName, SSN, BDate, Address, Sex, Salary)
2) Step 2 : 약한 엔터티 타입 사상
- 엔터티에 대한 릴레이션 R을 생성
- R에 엔터티의 모든 단순 애트리뷰트를 포함
- 그 후 모든 복합 에트리뷰트의 구성요소 포함
- R에 소유 엔터티의 기본키를 외래키로 포함
- 소유엔터티의 기본키와, 약한엔터티의 부분키를 조합해서 R의 기본키로 선택
- 만약 약한엔터티의 소유자 또한 약한엔터티면 소유자를 먼저 사상 후 피소유자를 사상해야 소유자의 기본키를 가져 올 수 있음
- Dependent(ESSN, DependentName, Sex, BDate, Relationbship)
- 릴레이션쉽에서는 생략(관계는 이미 소유자의 키를 가져오면서 처리되었음)
3) Step 3 : 1:1 이진관계 타입 사상
- 가능한 방법이 3가지
① 외래키 방식(한쪽이 전체참여일때 좋은듯)
- 엔터티 S와 엔터티T의 관계 R이 있을때
- 둘 중 하나를 S로 선택하는데, 전체참여인 쪽을 S로 선택하는 것이 좋다(NULL값이 적게 발생함)
- S에 외래키로 T의 기본키를 포함
- S에 관계의 애트리뷰트를 포함
② 두 릴레이션 통합(양쪽이 전체참여일때 좋음)
- 말그대로 그냥 통합(합쳐버리면 됨)
- Member(ID, Passwd), MmbrInfo(SSN, Address, BDate, TelNo, ...) 두개가 있을 때
- Member(ID, Passwd, SSN, Address, BDate, TelNo, ...) 이렇게 하나로 그냥 통합
③ 별도의 관계 릴레이션 생성(좋지 않은 방법 : 조인을 증가시켜 효율이 떨어질 수 있음, 하지만 관계가 극히 절을 경우 NULL을 줄일 수 있는 장점)
- 두 릴레이션 S와 T를 참조하는 릴레이션 R을 새로 만듬
- R에 S와 T의 기본키를 포함
- 그 후 관계의 애트리뷰트를 포함
4) Step 4 : 1:N 이진관계 타입 사상
- 1:N중 N쪽을 S로 선택
- S에 T의 기본키를 포함
- S에 관계의 애트리뷰트 포함
5) Step 5 : M:N 이진관계 타입 사상
- 별도의 릴레이션 R을 생성
- R에 S와 T의 기본키를 각각 외래키로 포함
- 이 외래키 둘을 조합하면 R의 기본키
- R에 관계의 단순애트리뷰트를 포함
6) Step 6 : 다중값 애트리뷰트 사상
- 별도의 릴레이션 R을 생성
- R에 애트리뷰트를 포함
- R이 소속된 엔터티의 기본키를 외래키로 포함
- 외래키와 애트리뷰트가 조합되서 기본키로 사용
- DeptLocations(DNumber, DLocation)
7) Step 7 : N-ary 관계 타입 사상
- 하나의 관계에 2개초과의 엔터티가 있을 때
- 별도의 릴레이션 R을 생성
- R에 모든 엔터티의 기본키를 외래키로 포함
- R에 관계의 애트리뷰트 포함
3-4) 정규화 |
- 관계형 데이터베이스 설계란?
- 좋은 릴레이션 스키마를 생성하기 위해 애트리뷰트들을 그루핑하는 과정
- 좋은 설계를 위해 차례대로 정규화 과정을 거쳐서 릴레이션을 손실없이 분해
- 분해과정에서 꼭 지켜야 하는 규칙 => 무손실 조인 분해, 함수적 종속 유지
- 하나의 릴레이션이 하나의 엔터티/하나의 릴레이션쉽을 나타내야 함(여러개를 하나가 나타내면 정보가 중복되며 저장공간이 낭비됨)
- NULL값을 가지지 않도록 설계해야 함
- NULL값은 공간을 낭비해 저장공간에 손해
- count나 avg등을 사용할때 null의 의미가 모호
- 조인연산을 지정하기 힘듬 등등
- 함수적 정속
- 애트리뷰트들의 집합 X와 Y가 있을 때 X의 값이 Y를 유일하게 결정한다면 Y는 X에 함수적으로 종속된다고 말함
- t1[X] = t2[X]라면 저절로 t1[Y] = t2[Y]가 된다.
- 예를들어 주민등록번호는 사원의 이름을 결정한다. 프로젝트번호는 프로젝트이름과 프로젝트위치를 결정한다.
- 이때 키는 모두 다르니까 t1[X] = t2[X]일수가 없으므로 키를 이용하면 모든 애트리뷰트들이 함수적으로 결정됨
- 정규화
- 불만족스러운 릴레이션의 애트리뷰트들을 나누어서 더 좋은, 작은 릴레이션으로 분해하는 과정
- 제1정규형, 제2정규형, 제3정규형, BC정규형, 제4정규형, 제5정규형
1) 제1정규형
- 릴레이션이면 제1정규형 만족
- 기본적으로 제1정규형은 만족
2) 제2정규형
- 함수적종속과 기본키개념을 이용
- 기본키에 부분함수적종속이면 안되고 완전함수적종속이어야 한다
- 예제: Emp_Proj(SSN, PNumber, Hours, EName, PName, PLocation)
- {SSN, PNumber} → Hours
- SSN → Hours와 PNumber → Hours가 성립하지 않기 때문에 완전 함수적 종속
- SSN → EName, PNumber → PName PLocation
- 기본키 {SSN, PNumber}에 대하여 SSN → ENAME이 성립하기 때문에 EName, PName, PLocation은 기본키에 부분 함수적 종속이 된다.
- 기본키에 완전함수적종속이 되도록 분해한다
- {SSN, PNUMBER, HOURS} , {SSN, ENAME}, {PNUMBER, PNAME, PLOCATIONS} 셋으로 분해
3) BCNF
- 제2정규형에서의 문제는 키가 아닌 애트리뷰트로도 함수적종속이 가능하다는 것
- 예를들어 릴레이션이 학생이름, 담당교수이름, 학과 이런식일때 키가 학생이름이라면, 학생이름으로 모두 함수적종속이긴 하지만 담당교수이름으로도 학과를 알수 있음. 근데 담당교수이름은 키가 아니기때문에 중복해서 존재 가능
- 해결법 : 모든 함수적 종속 X->A에 대하여 X가 키이다.
- 이 경우 X가 기본키이므로 절대 중복될수없음
- 좋은 방식이지만 항상 존재하지 않아서 없는 기준일수있음
4) 제3정규형
- BCNF가 항상 존재하지 않으므로 완화된 규정
- X->A에 대하여 X가 키이거나, A가 기본애트리뷰트이다.
3-5) DDL로 스키마, 테이블 등 만들고, DML로 데이터 채워넣기 |
DDL 정리 글 : https://smallpants.tistory.com/93
DML 정리 글 : https://smallpants.tistory.com/94
4. 제약조건 |
1) 도메인 제약
- 값은 애트리뷰트의 도메인값에 포함되어야 한다.
- 허용 된다면 NULL값을 가질 수 있음
2) 키 제약
- 릴레이션의 모든 튜플의 기본키 값은 다르다.
- 슈퍼키 : 애트리뷰트의 집합으로 식별성을 가지는 것(집합의 값이 모든 튜플에서 다름)
- 키 : 슈퍼키에서 애트리뷰트 하나를 제거하면 식별성이 없어지며, 애트리뷰트 갯수가 최소이며 식별성을 가지는 것, 여러개 존재 가능
- 예를들어 CAR(State, Reg#, SerialNo, Make, Model, Year)에서
두 개의 key가 있는데 Key1 = {State, Reg#}, Key2 = {SerialNo} 라면
둘 다 CAR의 superkey이지만 {SerialNo, Make}는 superkey이기는 하지만, key는 아니다. 키는 SerialNo
- 후보키 : 키가 여러개 있을 수 있는데 이들을 전부 후보키라고 부름
- 기본키 : 후보키들 중에서 사용하기 쉬운 키를 선택(애트리뷰트 갯수가 최소, 문자보다는 정수)
3) 엔터티 무결성 제약
- 기본키는 절대로 null값을 가질 수 없다
4) 참조 무결성 제약
- 다른 제약조건들은 하나의 릴레이션에 관련되는데 참조무결성제약만 두 릴레이션에 관계 됨
- 반드시 존재하는 튜플을 참조해야 한다.
- 참조하는 튜플이 null값이면 안된다.
- 삽입/삭제/수정할 경우 주의해야 함(튜플삽입, 튜플삭제, 외래키수정, 기본키수정)
5) 함수적 종속 제약
- 애트리뷰트들의 집합 X와 Y가 있을 때 X의 값이 Y를 유일하게 결정한다면 Y는 X에 함수적으로 종속된다고 말함
- t1[X] = t2[X]라면 저절로 t1[Y] = t2[Y]가 된다.
- 예를들어 주민등록번호는 사원의 이름을 결정한다. 프로젝트번호는 프로젝트이름과 프로젝트위치를 결정한다.
- 이때 키는 모두 다르니까 t1[X] = t2[X]일수가 없으므로 키를 이용하면 모든 애트리뷰트들이 함수적으로 결정됨
6) 기타 제약조건
- 의미적 무결성 제약조건 : 구조적인 제약이 아닌 내용적인 제약(사원은 상사보다 더 많은 급여를 받을 수 없다, 노동시간은 56시간을 초과할수 없다)
- 제약조건 명시 언어 사용 : trigger(해당 조건이 발생시 특정 행동을 하도록)나 assertion(항상 참으로 유지해야 하는 조건)
7) 제약조건이 위반된다면?
- 취소(해당 연산을 취소, RESTRICT or REJECT)
- 알림(연산을 일단 실행하고 사용자에게 알림)
- Trigger(위반을 수정사는 추가적인 변경을 시행, CASCADE, SET NULL)
- 사용자가 정한 별도의 수정 루틴을 실행