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)

- 사용자가 정한 별도의 수정 루틴을 실행