'DB'에 해당되는 글 4건

  1. 2012.09.14 Export
  2. 2009.06.02 DUAL 테이블
  3. 2009.02.27 개체 관계 모델(e-r model)
  4. 2009.01.07 DB Design시 고려해야 할 제약성(Constraint) 정의

Export

DB 2012. 9. 14. 15:04

Oracle Database TIP 강좌목록 

EXPORT
[2002-02-03] - 김정식 (33,995:Lv60)
57485
조회수
5
댓글수

 

EXPORT란?

  - 오라클에서 제공하는 논리적인 백업에 사용되는 유틸리티로써, binary file 형태로 기록한다.

  - $ORACLE_HOME/bin 디렉토리 안에 exp 실행파일이 있다. 윈도우의 경우 exp.exe파일

  - 데이터베이스가 가동중인 상태에서 실행한다.

  - 전체 데이터베이스, 특정 사용자, 특정 테이블들을 EXPORT 할 수 있다.

  - 권한, 인덱스, 제약조건들과 테이블들과 연관되는 데이터 딕셔너리 정보도 EXPORT 할 것인지를 선택할 수 있다.

  - 마지막 EXPORT 이후로 변경된 테이블들에 대해서만 EXPORT 작업을 실행 할 수도 있다.

EXPORT 옵션

  - userid : EXPORT를 실행시키고 있는 username/password 명.

  - buffer : 데이터 행들을 가져오는데 사용되는 버퍼의 크기.

  - file : 생성되는 EXPORT덤프 파일명

  - filesize : EXPORT덤프 파일의 최대 크기

  - grants : 데이터베이스 객체에 대한 권한 정보의 EXPORT여부 (Y/N 플래그)

  - indexes : 테이블에 대한 INDEXES의 EXPORT여부 (Y/N 플래그)

  - rows : 행들에 대한 EXPORT여부. (Y/N 플래그) 만약 "no"이면 데이터는 EXPORT 되지않고 테이블의 정의만 EXPORT 된다.

  - constraints : 테이블에 대한 제약조건 정보의 EXPORT여부 (Y/N 플래그)

  - compress : IMPORT에 대비하여 테이블의 데이터를 한 extent로 압축 할것인가의 여부 (Y/N 플래그)

  - full : 전체 데이터베이스를 EXPORT할것인가의 여부 (Full Level EXPORT) (Y/N 플래그)

  - owner : EXPORT 될 데이터베이스의 소유자 명 (User Level EXPORT)[owner=user]

  - tables : EXPORT될 테이블의 리스트(Table Level EXPORT) [tables=(table1, table2, ...)]

  - help : EXPORT 실행 시 파라미터에 관한 설명을 보여준다.

  - tablespaces : EXPORT 될 테이블스페이스의 리스트

  - log : EXPORT 실행 과정을 지정된 로그 파일에 저장

Full Level EXPORT

  전체 데이터베이스가 엑스포트 된다. 모든 테이블스페이스, 모든 사용자, 또한 모든 객체, 데이터들이 포함 된다.

 
exp  userid=system/manager file='C:\full.dmp' full=y
    

User Level EXPORT

  - 사용자 객체들이 EXPORT 되고 객체들 안에 있는 데이터도 EXPORT 된다.

  - 사용자 객체에 대한 모든 권한들과 인덱스들도 EXPORT 된다.

 
-- 사용자 자신이 만든 모든 오브젝트를 그 user가 EXPORT하는 방법
C:\>exp userid=scott/tiger  file='C:\scott.dmp'

-- SYSTEM계정으로 특정 user소유의 오브젝트들을 EXPORT 하는 방법
C:\>exp userid=system/manager owner=scott  file='C:\scottuser.dmp' 
    

Table Level EXPORT

  명시된 테이블만 EXPORT 되며, 테이블의 구조, 인덱스, 권한등이 테이블과 함께 EXPORT 된다.

 
-- SYSTEM계정으로 특정 유저의 table을 EXPORT하는 예제 
-- 다른 계정으로 EXPORT시 table의 user명까지 지정해야 EXPORT가 성공한다.
C:\>exp userid=system/manager file='C:exp.dmp' tables=(scott.EMP, scott.DEPT)

-- scott user로 table을 몇 개만EXPORT하는 예제
-- 자신의 table을 EXPORT할 때에는 user명을 지정할 필요가 없다. 
C:\>exp userid=scott/tiger file='C:\exp.dmp' tables=(EMP, DEPT) log=exp.log
    

 

'DB' 카테고리의 다른 글

Import  (0) 2012.09.14
CentOS6, Oracle 11g  (0) 2012.09.11
SELECT 문법  (0) 2012.01.11
유저 테이블 검색  (0) 2012.01.11
[오라클] 패스워드 잊었을때  (0) 2012.01.11
Posted by 으랏차
,

DUAL 테이블

DB 2009. 6. 2. 13:53

DUAL 테이블은 가상의 테이블이라고 보면 될 것 같다.

어떤 값을 알고자 할 때, 굳이 실제 테이블에 결과를 보지 않아도 DUAL테이블을 사용하면 된다.

예를 들어 아래와 같이 ROUND함수를 써서 그 값을 조회해본다고 가정하자.

SELECT ROUND(4567.678), ROUND(4567.678,0),

             ROUND(4567.678,2), ROUND(4567.678,-2)

FROM dual;

여기서는 특정 테이블의 칼럼을 가져다가 쓰는 것이 아니고 실제 값을 입력한 것이기 때문에 굳이 실제 테이블이 필요없다. 이럴 때는 dual을 쓰는 것이 유용하다.

[출처] DUAL 테이블|작성자 이경모


'DB' 카테고리의 다른 글

자형 함수  (0) 2009.06.02
숫자형 함수  (0) 2009.06.02
날짜형함수  (0) 2009.06.02
데이터형 변환  (0) 2009.06.02
TO_CHAR 함수  (0) 2009.06.02
Posted by 으랏차
,

개체-관계 모델

위키백과 ― 우리 모두의 백과사전.

데이터 모델링 분야에서 개체-관계 모델이란 구조화된 데이터에 대한 일련의 표현이다.

서로 관계된 두 개의 엔티티

"구조"화된 데이터를 저장하기 위해 데이터베이스를 쓴다. 이 데이터의 "구조" 및 그에 수반한 제약 조건들은 다양한 기법에 의해 설계될 수 있다. 그 기법 중 하나가 개체-관계 모델링(Entity-Relationship Modelling)이다. 줄여서 ERM이라고 한다. ERM 프로세스의 산출물을 가리켜 개체-관계 다이어그램(Entity-Relationship Diagram)이라 한다. 줄여서 ERD라 일컫는다. 데이터 모델링 과정은 데이터 모델을 그림으로 표현하기 위해 표시법을 필요로 한다. ERD는 개념적 데이터 모델 혹은 시맨틱 데이터 모델의 한 타입이다.

목차

[숨기기]

[편집] 사용처

정보 시스템을 디자인 해나가는 데에 위와 같은 모델들을 사용하여 시스템이 필요로 하는 정보를 기술한다든가 데이터베이스에 저장되어야 할 정보의 타입(type)이 무엇인가 분석해 나갈 수 있다. 특히 요구사항 단계에서 말이다.

어떤 도메인 오브 디스코스(관심 대상이 되는 부분)의 온톨로지를 기술할 때, 데이터 모델링 테크닉이 사용될 수 있다. (사용된 텀들(terms)과 그들과의 관계를 정의하고 분류하는 일이다.) 데이터베이스에 기반한 정보 시스템(information system)을 디자인하고자 하는 경우에는 나중에 가서는(논리 설계 단계) 개념 데이터 모델은 논리적 데이터 모델로 맵핑된다. 논리적 데이터 모델은 관계형 모델 같은 것이다; 뒤이어 논리적 데이터 모델은 물리 설계 단계에서 물리적 디자인 모델로 다시 맵핑된다. 단, 이와 같은 단계를 모두 뭉뚱그려 "물리 설계"라고 일컫기도 한다.

개체-관계 다이어그램(ERD)를 그리는 데에는 수많은 관습/방법(convention)이 존재한다. ERD를 그리는 데 아주 고전적인 방법이 이 문서의 아래에 기술되어 있다. 아래 기술된 방법은 개념 모델링과 주로 연관되어 있다.

데이터베이스 논리설계 및 물리설계 단계에서는 관습적으로 쓰이는 노테이션(notation)들이 몇 가지 더 있다. 예를 들면 인포메이션 엔지니어링, IDEF1X (ICAM DEFinition Language), 디멘저널 모델링 같은 것들이다.

[편집] 전통적인 다이어그램 컨벤션

서로 관계된 두 개의 엔티티
애트리뷰트를 갖는 엔티티
애트리뷰트를 갖는 관계
ER 다이어그램 예제

개체(엔티티)는 분리된 물체 하나를 표현한다. 엔티티는 명사 하나에 해당한다고 생각하면 쉽다. 예를 들면 다음과 같다: 컴퓨터(1개), 사람(1명), 악곡(1개), 수학적 정리(1개). 엔티티는 사각형으로 표시된다.

관계(릴레이션쉽)는 두 개 이상의 엔티티들이 어떻게 서로 연관되어 있나를 기록한다. 예를 들면 다음과 같다: 회사와 컴퓨터 사이의 "소유하다"라는 관계, 상사와 부하 직원 사이의 "감독하다"라는 관계, 연주자와 악곡 사이의 "연주"라는 관계, 수학자와 수학 정리 사이의 "증명했다"라는 관계 등이다. 관계는 다이아몬드형으로 그리는데, 관계된 엔티티와는 실선으로 연결한다.


엔티티도 애트리뷰트를 가질 수 있고, 관계로 애트리뷰트를 가질 수 있다. 예를들면 다음과 같다: 피고용인 엔티티는 생년월일 애트리뷰트를 가질 수 있다; "증명됐다" 관계는 "날짜" 애트리뷰트를 가질 수 있다. 애트리뷰트는 엔티티 집합이나 관계 집합에 선으로 연결시킨 타원형들로 그린다.

모든 엔티티(위크 엔티티가 아닌 한)는 "고유하게 식별되는" 애트리뷰트 집합을 가지고 있어야 한다. 최소한의 고유 식별 애트리뷰트 집합은 엔티티의 기본 키(Primary Key)라 불린다.

개체-관계 다이어그램은 하나의(single) 엔티티를 보여주고 있거나 하나의(single) 관계 인스턴스를 보여주고 있는 것은 아니다. 사각형은 "엔티티 집합들"을 나타내고 있는 것이고, 다이아몬드형은 "관계 집합들"을 보여주고 있는 것이다. 예를 들면 다음과 같다: 특정한 악곡은 하나의 엔티티이다. 하나의 데이터베이스 안의 모든 악곡들의 모음은 하나의 엔티티 집합이다. 한 아이와 그 아이의 점심 도시락 사이의 "먹어치움" 관계는 하나의(single) 관계이다. 하나의 데이터베이스 안의 모든 그러한 아이-점시 도시락 관계는 관계 집합이다.

실선은 관련된 엔티티 집합과 관계 집합 사이에 그린다. 엔티티 집합의 모든 엔티티가 관계에 참여(participate)하고 있을 때, 선을 굴게(thick) 그리거나 이중선(double) 으로 그린다. 이것을 파티시페이션 콘스트레인트라고 부른다. 엔티티 집합 내의 각각의 엔티티가 관계 집합 내의 최대 한 개의 관계에 참여할 수 있을 때, 엔티티 집합에서 관계 집합 쪽으로 화살표를 하나 그려준다. 이것을 키 콘스트레인트라고 부른다. 엔티티 집합 내의 모든 엔티티가 각각 하나씩의 관계에 정확히 대응될 때는 화살표를 굵게(thick) 그린다.

다대다(many-to-many) 관계를 기술할 때는 어소시에이티브 엔티티를 사용할 수 있다. [1].

단일 테이블의 행 사이의 관계를 기술하기 위해 단방향 관계(Unary Relationships)를 사용할 수도 있다.

[편집] 때때로 쓰이는 기호

ER 모델링에서 어떤 기호들은 그렇게 자주 사용되지 않는다. 모델러들은 이러한 기호들을 종종 기피한다.

엔티티는 "스트롱(strong)" 엔티티일 수도 있고 "위크(weak)" 엔티티일 수도 있다.

  • 상기 단락에서 기술한 보통의 엔티티를 가리켜 "스트롱 엔티티"라고 한다. 스트롱 엔티티는 엔티티가 가진 애트리뷰트들만 가지고 고유하게 정의될 수 있다.
  • "위크 엔티티"는 엔티티가 가진 애트리뷰트들만 가지고 고유하게 정의될 수 없는 엔티티를 말한다. 따라서 한 개 이상의 관계를 엔티티의 프라이머리 키로 삼아야 한다. 위크 엔티티는 엔티티를 나타내는 사각형을 그리고, 관계를 나타내는 다이아몬드형을 그린 뒤, 그 둘을 굵은(bold) 선이나 이중(double)선으로 연결하여 표현한다. 예를 들면, 업무 추적(work tracking) 데이터베이스에서는, 한 태스크(task)는 태스크를 할당받은 사람(person)을 이용하여 식별된다. 이 때 사람(person)은 엔티티이고, 태스크(task)는 위크 엔티티가 된다.

ER 모델링에서 애트리뷰트들은 다치(multi-valued) 애트리뷰트일 수도, 합성(composite) 애트리뷰트일 수도 혹은 종속(derived) 애트리뷰트일 수 도 있다:

  • "다치 애트리뷰트"(multi-valued attribute)는 이중선(double line)으로 둘러싸인 타원으로표현된다. 적어도 한 개체의 인스턴스에 대해서 한 개 이상의 값을 가질 수 있는 애트리뷰트이다. 예를 들어, 소프트웨어(엔티티는 "애플리켜이션")는 다치값의 "플랫폼" 애트리뷰트를 가질 수 있다. 애플리케이션의 인스턴스는 한 개 이상의 플랫폼 상에서 동작할 수 있기도 하기 때문이다.
  • "합성 애트리뷰트"(composite attribute)는 두 개 이상의 애트리뷰트를 포함할 수 있는 애트리뷰트를 말한다. 자기 자신도 포함할 수도 있다. 예를 들면 주소는 번지, 도시 등등의 애트리뷰트들로 이루어진 합성 애트리뷰트라 할 수 있다.
  • "추출 애트리뷰트"(derived attribute)는 그 값이 데이터베이스의 다른 정보에 의해 결정되는 애트리뷰트를 말한다; 종속 애트리뷰트는 점선으로 그린 타원형으로 표시한다. 예를 들면, 피고용인 데이터베이스가 있다고 가정할 때, "피고용인"의 "나이" 애트리뷰트는, "피고용인"의 "생년월일" 애트리뷰트로부터 추출/유도(derive)해낼 수 있다.

때때로 어떤 두 엔티티가 더 일반적인 분류의 엔티티의 하위 분류일 경우가 있을 수 있다. 예를 들면, 소프트웨어 기업의 피고용인 엔티티는 프로그래머 엔티티일 수 있고 마케터 엔티티일 수 있다. 위와 같은 경우, ISA라는 말을 안에 써 넣은 삼각형으로 표시한다. 수퍼클래스는 위쪽에 그리고 다른 두 개(혹은 그 이상)의 서브클래스들은 밑변쪽(아래쪽)에 그린다.

어떤 한 개의 관계와 그것과 엮인 엔티티 집합들은 다시 단일 엔티티 집합으로 간주될 수있다. 이것을 어그리게이션이라 하는데, 다른 관계와 엮을려는 목적이다. 어그리게이션은 어그리게이트된 모든 개체와 관계를 둘러싼 점선 사각형으로 표시된다.

[편집] 다른 다이어그램 컨벤션

[편집] 크로우즈 핏 (까마귀 발)

크로우즈 핏 노테이션을 사용해 나타낸 두엔티티

크로우즈 풋/크로우즈 핏(Crow's Foot) 노테이션에서는, 엔티티 사이의 관계를 기본적으로 엔티티를 연결하는 선으로 나타낸다. 또한 관계의 카디널리티를 나타내는 기호들을 그 선의 양끝에 표시한다.

카디널리티를 나타내는 기호들은 다음과 같은 것들이 있다:

  • "고리"(ring)은 "0"를 나타낸다.
  • "사선"(dash)은 "1"을 나타낸다.
  • "까마귀 발"(crow's foot)은 "다수" 혹은 "그 이상"을 나타낸다.

위와 같은 기호들은 서로 조합되서 사용될 수 있다. 다음과 같은 네 가지 조합이 가능하다.

  • 고리와 사선 → 0 혹은 1
  • 사선과 사선 → 정확히 1
  • 고리와 까마귀 발 → 0개 이상
  • 사선과 까마귀 팔 → 1개 이상

크로우즈 핏(crow's feet) 노테이션의 예제는 오른쪽 그림을 참조하라.

오른쪽 그림에서, 우리는 다음과 같은 사실을 알 수 있다:

  • 음악가(Artist)는 "0개 혹은 그 이상의" 노래(song)를 부른다.
  • 노래 한 곡은 정확히 한 음악가(artist)에 의해 불러진다. (주의: 실제 세계를 잘 반영하지못하는 예제이다. 노래 한 곡을 듀엣으로 부를 수도 있는 것이다.)

크로우즈 핏 노테이션은 오라클 데이터베이스 텍스트에서 널리 쓰이고 있다. 또한 마이크로소프트 비지오, 파워디자이너, 다이어 (소프트웨어) 등의 틀에서 쓰이고 있다.

[편집] 장점

  • 크로우즈 핏 노테이션을 사용하면 다수(many) 관계를 표현하는 것이 명확해 진다.
  • 필수적인 관계가 있다면, 크루오즈 핏 노테이션은 그것을 표현하기 위한 간결한 노테이션이 된다. 이 때는 수직선만 표시하면 된다. 또한 옵셔널한 관계가 있다면, 그것을 표현하기 위한 간결한 노테이션이 되는데, 이 때에는 고리(open circle)로 표시하면 된다.

[편집] 같이 보기

[편집] 상용 ER 다이어그램 작성 툴

[편집] 자유 소프트웨어 ER 다이어그램 작성 툴

  • DBDesigner: ERM을 채택한 MySQL 데이터베이스 설계자를 위한 툴.
  • DBDesigner-Fork: DBDesigner의 변종. PostgreSQL과 같은 다른 데이터베이스 시스템도 이용할 수 있게 변형됨.
  • 다이어 (소프트웨어): ERD 외에도 다른 여러 다이그램을 작성할 수 있는 툴.
  • 페렛 (소프트웨어): 데비안, 우분투와 같이 배포되는 ERM 툴.
  • 카이비오: (Kivio) ER 다이어그램도 지원하는 순서도 그리기 툴.
  • MySQL 웍벤치: (MySQL WorkBench) 그래픽하게 스키마와 리버스 엔지니어링 스키마들을 작성할 수 있다. 여러 데이터베이스 엔진을 타겟으로 한다.
  • 오픈 시스템 아키텍트: (Open System Architect) ER 다이어그램 모델러. 가장 최근 버전은 2005년에 나온 것이다.
  • 파워*아키텍트: (POWER*ARCHITECT) 자바 언어로 작성된 ER 다이어그램 모델러. 여러 자유 소프트웨어 및 상용 데이터베이스 엔진을 타겟으로 함.

[편집] 주석

피터 첸이 지은 이 논문은 컴퓨터 과학 분야에서 가장 많이 인용되는 논문이다. 1000여 명의 컴퓨터 과학과 교수 설문 결과 "가장 영향력 있는" 논문으로 꼽혔다. 인용 논문의 목록은 DBLP: http://dblp.uni-trier.de/ [2] 등지에서 볼 수 있다.

Posted by 으랏차
,

<출처: 엔코아 - 열린기술광장>

PURPOSE

RDBMS의 물리적인 데이터베이스 설계시 필요한 각종 제약성 정의 (Integrity Constraints)에 대하여 정확한 의미를 전달하고자 한다.

SCOPE & APPLICATION

RDBMS 에서는 서로 독립적이면서 데이터의 중복을 최소화하면서도 필요시 언제든지 서로 관계 연산자를 위용하여 정보의 연결을 가능하게 하여 새로운 정보를 창출하게 하는 위력을 가지고 있다. 또한 DB설계시 정의된 설계 사상에 대하여 DBMS Level에서 사전 정의를 할 수 있으며 이로 인하여 데이터의 일관성 및 일치성 그리고 무결성을 응용 프로그램의 추가 부담이 없이 보장 받을 수 있다.

그러나, 실제 고객사의 상황을 접하면 성능 또는 User Interface 불편 등을 이유로 하여 제대로 DBMS의 효율적인 기능을 활용하지 못하고 비정상적인 데이터들이 누적되고 있는 상황을 많이 접하게 된다.

여기서는 RDBMS를 이용한 DB설계시 고려할 수 있는 각종 Constraint에 대한 현실 활용 이해를 높이고 상황에 다른 명확한 적용지침을 기술토록 한다.

KEY IDEA

(KEY WORD : Referential, Constraint, Integrity, 무결성, 제약, 참조, DB Design)

SUPPOSITION

DESCRIPTION

  • RDBMS 에서 언급하는 대표적인 사전 제약정의 (Pre-Define Constraints)는 참조 무결성(Referential Integrity) , 속성 무결성(Attribute Integrity) , 엔터티 무결성(Entity Integrity) 그리고 사용자정의 무결성(User Defined Integrity)과 같이 대표적인 네가지 무결성 정의를 사용할 수 있다.
  • 그럼, 다음 [그림1]의 사례 Instance를 이용하여 대표적인 네가지 형태의 무결성 정의에 대하여 각각 상세히 살펴보자

                      

[그림 1]

  • 엔터티 무결성(Entity Integrity)

기본키(Primary Key)를 구성하는 모든 속성은 반드시 값을 가져야 한다. (not null)

√기본키(Primary Key)는 유일성을 보장해 주는 최소한의 집합이어야 한다. (minimal set of attributes)

√상기 제약 정의의 대표적인 Constraints는 PRIMARY KEY, UNIQUE, NOT NULL constraints가 해당 된다.

√즉, 엔터티 무결성이란 엔터티의 자격 검증을 할 수 있는지를 엄밀히 검토해 보면 명확해 진다. 실제 현실에서는 PK도 존재하지 않는 테이블을 사용하고 있는 경우도 다반사라는 것을 여러분 중에서도 경험자가 많을 것이다.

√ 하나의 엔터티가 물리적인 테이블로서 존재의 의미를 부여받기 위해서는 반드시 그 테이블에 존재하는 수많은 Row(Tuple) 중에서 유일한 Row(Tuple)를 인식할 수 있는 식별자가 있어야 된다는 것은 이미 데이터 모델링 단계의 엔터티 자격 검증에서 이루어졌을 것이며 이러한 엔터티 자격의 원칙이 물리적인 DB Design단계에서는 바로 PK 정의가 된다.

√고로, 식별자가 되기 위해서는 절대 모르는 값(Null)이 식별자가 될 수 없음은 당연한 이치이며,

√데이터 모델링 단계에서는 엔터티가 태어나기 위한 부모가 명확하게 정의되어 의미상의 주어가 식별자가 되었다면 물리적인 측면을 고려하여 최소한의 식별자를 구성하기 위한 속성 검토 역시 설계자가 노력하여야 되는 것도 당연한 이치이다.

√ 만일 A라는 엔터티의 식별자(UID)가 고객코드+상품코드+계약순번 으로 구성된다고 가정해 보자. 그리고 이러한 A라는 엔터티는 업무적으로 자료발생의 중심이 되는 메인 엔터티라면 또다시 수 많은 자식 엔터티를 탄생하게 되어 손자, 증손자 등의 후손 엔터티를 갖게 될 경우에는 직접종속 속성으로 PK를 상속받아 구성할 경우에는 손자, 증손자 대 에서는 PK구성 속성은 엄청나게 많은 속성들이 복합구성으로 필요로 하게될 것이다.

√ 이러한 문제를 미연에 예방하기 위해서 인공식별자(얼굴마담,Artificial UID)를 데이터 모델링 단계에서 고려할 수 있으며, 데이터 모델링 단계에서 지정하지 못할 경우에는 물리적인 DB Design 단계에서 최소의 속성 모임으로 PK를 지정하게 하는 것이다. 이것이 바로 Minimal Set Of Attributes 정의이다.

√유일한 식별자 지정은 테이블의 수많은 컬럼을 조합시킨다면 당연히 PK 자격이 될 수 있으나, 진정으로 임의의 Row를 인식시킬 수 있는 최소한 컬럼으로 정의하여야 된다는 의미이다.

√상기 [그림1] 예제에서 엔터티 무결성을 정의한 DEPT Table을 위한 DDL Script는 다음과 같다.

Create Table DEPT
(deptno number
not null primary key,
dname varchar(20),
loc varchar(20))

  • 참조무결성 (Referential Integrity)

외부키(Foreign Key)는 반드시 존재하고 있는 기본키(Primary Key)와 연결되거나 NULL 이어야 한다

√상기 제약 정의의 대표적인 Constraints는 Reference constraint 가 해당 된다.

√즉, RDBMS는 모든 엔터티들이 관계(Relation)를 가지고 설계되어 서로 독립적인 정보들만으로 데이터의 중복을 억제할 수 있는 기본 사상이 바로 관계(Relation)이다.

√임의의 엔터티는 관계(Relation)를 통하여 정의되어 있을 경우에는 해당 관계의 1쪽(부모:참조되는쪽) 식별자 속성이 관계 명칭으로 M쪽(자식:참조하는쪽) 물리적인 테이블에 속성(컬럼)으로 생성되게 된다.

√이렇게 관계에 의하여 생성된 컬럼은 반드시 부모가 존재해야 만이 생성될 자격이 있으며 이러한 원리를 정의하는 DBMS Constraint가 바로 Referential Constraint이다.

√고로, 관계가 아직 정해지지 않고 Row(Tuple)가 생성된 경우 즉, 아직 관계를 모르는 경우에는 값이 Null이어야 하며 관계가 생성될 경우에는 반드시 존재하는 부모의 식별자가 컬럼 값으로 사용되어야 한다.

√ 이렇게 RI(Referential Integrity) 정의가 되어 있는 상황에서는 부모(참조되는쪽) 테이블의 임의의 Row (tuple)를 삭제할 경우에는 자식(참조하는쪽)들에서 RI가 지정되어 있다면 함부로 자식이 있는 부모가 사라질 수 없도록 DBMS는 자료의 참조 무결성을 보장하기 위하여 체크 및 검증을 내부적으로 보장하게 한다.

√이러한 RI 정의가 명확하게 되어 있을 경우에는 부모가 없는 자식 정보가 태어나거나, 자식이 있음에도 불구하고 부모의 정보가 사라지게 되는 참조무결성 위험요소를 극복할 수 있다.

√ 그러나, 현실 Project에서는 이 뛰어난 DBMS능력을 배제하고자 한다. 이유는 초기단계에서의 Data Migration 및 개발 프로그램 테스트시에 정확한 Data의 관계를 체크하여 줌으로 인하여 오히려 짜증을 내게 되며 다량의 초기 정보 구축시에는 부모 정보의 정확한 구축이 되어야 자식정보 구축이 가능하기 때문에 시간이 부족한 상황에서 병렬로 진행하고자 이를 모두 무시하고(Disabled) 개발을 진행하게 된다.

√이러한 상황은 충분히 이해를 할 수 있으나, 이러한 무방비책을 운영환경까지 고수하는 것은 안될 말이다. 즉, Migration시 쓰는 기법은 그 단계에서만 효율적이라는 예기이다.

√ 그동안의 IT 시스템의 주 관심은 자료의 축적 그리고 업무처리에 중심을 둔 시스템 구축이었으나 최근의 환경은 유행처럼 번지고 있는 DataWare House , DB Marketing이다. 이러한 DW의 성공 여부는 바로 정확한 정보의 숙성된 축적정보가 핵심이며 이를 위해서 DW 프로젝트에서 얼마나 많은 노고를 ETT에 쏟아야만 하는가 ? 또 그 엄청난 노력에도 불구하고 얻는 효과가 미흡하다는 결론이 당연시 되는 이유는 바로 기본에 충실하지 못했던 과거의 업보가 아닌가 ?

√ 혹자는 RI, PK 등 각종 Constraints 들로 인하여 성능상 문제가 있어 어쩔 수 없이 모두 해제하여 사용하고 있다고 한다. 진정 그런가 ? 아니다 ! DBMS Internal Processing에 의하여 보장되는 이러한 기능은 성능상 문제를 일으킬 만한 어리석은 DBMS는 아마 사장되었을 것이다. 성능의 문제는 바로 다른 곳에 있다. 이러한 잘못된 판단기준은 대부분 대량의 초기 데이터 구축시 체험한 감으로 잘못된 기준을 스스로 만들고 있는 것이다.

√ 대량의 데이터를 생성할 초기 Migration 시점이나 대량의 Batch작업시에는 해당 Constraints를 Disable시킨 상황에서 작업하는 것이 정답이며 작업 후 최단시간에(Parallel등의 기법 이용) Enable시키는 것이 정답이다. 단, 대량 데이터 처리시에 각종 제약사항을 모두 만족시키도록 데이터 생성 원칙을 준수한 프로그램이 되어야 할 것이다. 그외의 Online TXN 및 업무적인 데이터 처리에서의 성능상 문제는 결코 지대하지 않다는 것을 알아야 한다.

√ 이러한 Constraint 지정을 잠시 묵인토록 하는 Disable기법이나, 관계를 무시한 데이터의 삭제 및 수정작업을 위한 DDL Script는 DBMS마다 사용하는 방법에 약간의 차이가 있다. 하지만 어느 RDBMS에서나 이러한 작업을 위한 기법은 다 사용이 가능하니, 해당 DBMS Vendor에서 제공되는 SQL Reference Manual을 참고하기 바란다. (예:Oracle Cascade option : SQL Reference Manual , Create table, Alter table, constraint clause)

√상기 [그림1] 예제에서 참조적 무결성을 정의한 DEPT와 EMP Table을 위한 DDL Script는 다음과 같다.

Create Table DEPT
(deptno number
not null primary key,
dname varchar(20),
loc varchar(20))

Create Table PROJ
(projno number
not null primary key,
projname varchar(20),
stdt date,
enddt date)

Create Table EMP
(empno number
not null primary key,
ename varchar(20),
deptno number
references dept,
projno number
references proj)

  • 속성무결성 (Attribute Integrity)

컬럼은 지정된 데이타 형식(format,type,size)을 만족하는 값만 포함해야 한다.

√ 상기 제약 정의의 대표적인 Constraints는 DDL Script에 사용되는 Data Type (size)들이며, 예를들면 숫자를 위한 NUMBER, 고정길이 Alpha-Numeric을 위한 CHAR, 가변길이 Alpha-Numeric을 위한 VARCHAR 등, DATE, LONG, LONG RAW 등등 DBMS제품마다 약간의 차이는 있지만 대부분 범용적으로 사용되는 Data type은 어는 DBMS나 거의 유사하다.

√임의의 테이블에는 하나 이상의 여러 속성들이 정의되게 되며 이러한 속성들은 물리적인 테이블의 컬럼들로 정의되게 되며 이렇게 하나의 컬럼이 지정될 경우에는 Datatype 및 Format이 지정되어야 한다.

√ 예로, 사원번호라는 컬럼이 number data type으로 정의될 경우에는 반드시 숫자 값만이 사원번호에 들어올 자격이 있으며 만일 사원번호 컬럼을 number(4) 로 지정할 경우에는 숫자 값 중에서 4자리수 이내의 값만이 들어올 자격이 있다는 의미이다.

√어떻게 보면 이러한 속성 무결성을 위한 고려는 매우 쉽게 생각하거나 간과하여 지나치는 경우가 많다.

√ 그러나, 진정 RDBMS내부를 아는 설계자라면 하나의 컬럼의 data type 및 format을 결정하는데 수 많은 고려를 하게 된다. 매출일자라는 컬럼의 Data type을 character로 지정하여야 하는지, 아니면 date format으로 지정하여야 할지 설계자의 짧은 판단으로 인하여 수많은 개발자와 후손들로부터 지탄의 대상이 되어서는 안된다. 이 부분에 대한 설명(data type의 결정)만으로도 언급해야 될 사항이 많기 때문에 별도의 자료에서 언급하기로 하고 여기서는 Integrity constraint에 대해서만 언급하기로 한다.

√상기 [그림1] 예제에서 속성 무결성을 정의한 DEPT Table을 위한 DDL Script는 다음과 같다.

Create Table DEPT
(deptno
number not null primary key,
dname
varchar(20),
loc
varchar(20))

  • 사용자정의 무결성(User defined Integrity)

DB에 저장된 모든 데이타는 사전 정의된 업무규칙 (Business rule)을 준수해야 한다.

√상기 제약 정의의 대표적인 Constraints는 DDL Script에 사용되는 Check와 Default constraints이다.

√ 또한, 단순한 정의로 DB Internal Processing 에 도움을 얻기가 어려고 정의를 표현하기가 난해하여 적용하기가 어려운 업무규칙에 대해서는 DataBase Trigger를 이용하여 사용자 정의 무결성 보장을 하기도 한다.

√ 예로, 계약일자와 유효시작일자 라는 컬럼은 업무적으로 계약일자 <= 유효시작일자 라는 정의를 지켜야 한다거나, 계약금액은 100,000원 이상만이 들어올 수 있다는 업무 규칙 또한, 아무 값이 지정되지 않고 하나의 Row가 생성될 경우에 특정 컬럼의 값을 초기치(Default) 값으로 자동 입력토록 하는 등, 이러한 일련의 무결성 정의을 하고자 할 경우 설계자의 의도에 맞추어 정의할 수 있다.

√ 상기와 같은 단순한 무결성 정의로는 해결되지 않는 다소 복잡한 무결성 정의을 지정할 경우에는 흔히 사용하는 기법이 바로 DB Trigger이다. DB Trigger에서는 절차적인 판단 및 DML처리를 할 수 있으며, 거의 무제한에 가까운 사용자 정의 무결성 정의를 가능하게 하기 때문에 개발자들이 자주 사용하는 기법 중의 하나이다. 그러나, DB Trigger는 성능상 문제를 극복하기 위해서는 목숨걸고 최적화에 심혈을 기울여야 한다는 것을 명심하여야 한다.

√상기 [그림1] 예제에서 사용자정의 무결성을 정의한 PROJ Table을 위한 DDL Script는 다음과 같다. DB Trigger에 대한 예제는 DBMS 공급업체의 매뉴얼을 참고하기 바란다.

Create Table PROJ
(projno number not null primary key,
projname varchar(20)
check (projname = upper(projname)),
stdt date
check (stdt >= to_date('20000101','yyyymmdd')),
enddt date
check (enddt <= to_date('20000101','yyyymmdd')),
check (stdt <= enddt))

  • 끝으로 이러한 무결성 정의시에는 위에서 필자가 제시한 방법을 그대로 사용하지 말기 바란다. 문제는 이러한 무결성 정의에 대한 제어가 필요할 경우가 도래할 경우를 대비하여 모든 Constraint는 가급적 설계자 Naming Rule에 근거하여 모두다 Constraint name을 지정하여 생성하기 바란다. 이를 위하여 독자께서는 DBMS Vendor에서 제공하는 매뉴얼을 참고하여 향 후 Control이 가능한 정의를 하여야 한다.

'sql' 카테고리의 다른 글

JOIN  (0) 2009.01.08
Mysql Account 생성  (0) 2009.01.07
root 사용자 password 바꾸기  (0) 2009.01.07
mysql 한글지원설정  (0) 2009.01.07
mysql 동시접속자수  (0) 2009.01.07
Posted by 으랏차
,