[oracle] 오라클 데이터 모델링 - 제약 조건
오라클 데이터 모델링 - 제약 조건
제약 조건
Constraints
Unique Identifier (식별자)
- UID : A(Attribute 하나), A++(Attribute 두개 이상), A+R(Attribute와 relationship의 조합), R++(relationship 두개 이상)
- UID 찾는 순서
- 1.Attribute를 이용해서 UID 결정하세요.
- 2.필요할 경우 Attribute + Relationship으로 UID를 결정하세요.
- 3.필요할 경우 Artificial Attribute를 이용해서 UID를 결정하세요.
- cf.1:M 관계에서 1쪽의 UID가 복잡할 경우 Database Design시에 M쪽에 컬럼이 많이 생긴다.
- [식별자 관계(UID의 일부가 되는 Relationship)]와 [비식별자 관계(UID의 일부가 되지 않는 Relationship)]를 결정
~ 식별자 관계 -> PK 구조가 복잡해진다. 중복이 많아진다.
A : REGIONS
a1 (pk)
a2
B : COUNTRY
b1 (pk)
b2
a1 (pk), (fk)
C : DEPT
c1 (pk)
c2
b1 (pk), (fk)
a1 (pk), (fk)
D : EMP
d1 (pk)
d2
c1 (pk), (fk)
b1 (pk), (fk)
a1 (pk), (fk)
~ 비식별자 관계 -> 정보가 단절되어 과다한 조인이 필요해진다.
A : REGIONS
a1 (pk)
a2
B : COUNTRY
b1 (pk)
b2
a1 (fk)
C : DEPT
c1 (pk)
c2
b1 (fk)
D : EMP
d1 (pk)
d2
c1 (fk)
[1] 식별자 관계 : C, D 조인
select e.*
from dept d, emp e
where d.deptid = e.deptno
and d.country_id = e.country_id
and d.region_id = e.region_id
and d.name = 'SALES';
[2] 식별자 관계 : A, D 조인
select e.*
from region r, emp e
where r.region_id = e.region_id
and r.name = 'ASIA';
[3] 비식별자 관계 : C, D 조인
select e.*
from dept d, emp e
where and d.deptid = e.deptno
and d.name = 'SALES';
[4] 비식별자 관계 : A, D 조인
select e.*
from region r, country c, dept d, emp e
where r.region_id = c.region_id
and c.country_id = d.country_id
and d.deptid = e.deptno
and r.name = 'ASIA';
4-7
drop table orders purge;
drop table customers purge;
create table customers
(family_name varchar2(10),
initials varchar2(10),
address varchar2(30),
telephone varchar2(11),
constraint customers_pk primary key(family_name, address));
create table orders
(order_date date,
family_name varchar2(10),
address varchar2(30),
constraint orders_pk primary key(order_date, family_name, address),
constraint orders_fk foreign key(family_name, address) references customers(family_name, address));
>> 복합PK 컬럼 순서는 주의해서 결정해야 합니다.
~ 오라클의 Index는 Rowid를 전문적으로 보관하는 객체(물론 Key 컬럼의 값도 보관함)
~ 복합 인덱스 설계시 컬럼 순서를 결정하는 방법
항상 사용되는 컬럼
↓
항상 =로 사용되는 컬럼
↓
유일값이 많은 컬럼
↓
기타 여러 기준
<예제>
where a =
and b =
and c =
where a =
and c =
where b like
and c =
where c =
도출된 인덱스 : c + a + b
4-8
drop table rooms purge;
drop table floors purge;
drop table hotels purge;
create table hotels
(name varchar2(10),
primary key(name));
create table floors
(no number(2),
hotel_name varchar2(10),
primary key(no, hotel_name),
foreign key(hotel_name) references hotels(name));
create table rooms
(no number(2),
floor_no number(2),
hotel_name varchar2(10),
primary key(no, floor_no, hotel_name),
foreign key(floor_no, hotel_name) references floors(no, hotel_name));
--문제1
DROP TABLE t_customers PURGE;
DROP TABLE t_orders PURGE;
CREATE TABLE t_customers
( family_name VARCHAR2(20),
initials VARCHAR2(10),
address VARCHAR2(30),
telephone VARCHAR2(15),
PRIMARY KEY(family_name, address)
);
CREATE TABLE t_orders
( family_name VARCHAR2(20),
address VARCHAR2(30),
order_date DATE,
PRIMARY KEY(order_date),
FOREIGN KEY(family_name, address) REFERENCES t_customers(family_name, address)
);
[사진출처 : 오라클(RDM_vol.1_English)]
--문제2
CREATE TABLE a
( a1 VARCHAR2(10),
a2 VARCHAR2(10),
PRIMARY KEY(a1)
);
CREATE TABLE b
( b1 VARCHAR2(10),
b2 VARCHAR2(10),
a1 VARCHAR2(10),
PRIMARY KEY(b1, b2),
FOREIGN KEY(a1) REFERENCES a(a1)
);
CREATE TABLE c
( c1 VARCHAR2(10),
c2 VARCHAR2(10),
b1 VARCHAR2(10),
b2 VARCHAR2(10),
PRIMARY KEY(c1),
FOREIGN KEY(b1, b2) REFERENCES b(b1, b2)
);
CREATE TABLE d
( d1 VARCHAR2(10),
d2 VARCHAR2(10),
c1 VARCHAR2(10),
PRIMARY KEY(d1),
FOREIGN KEY(c1) REFERENCES c(c1)
);
--문제3
CREATE TABLE aa
( a1 VARCHAR2(10),
a2 VARCHAR2(10),
PRIMARY KEY(a1)
);
CREATE TABLE bb
( b1 VARCHAR2(10),
b2 VARCHAR2(10),
a1 VARCHAR2(10),
PRIMARY KEY(b1, b2, a1),
FOREIGN KEY(a1) REFERENCES aa(a1)
);
CREATE TABLE cc
( c1 VARCHAR2(10),
c2 VARCHAR2(10),
b1 VARCHAR2(10),
b2 VARCHAR2(10),
a1 VARCHAR2(10),
PRIMARY KEY(c1, b1, b2, a1),
FOREIGN KEY(b1, b2, a1) REFERENCES bb(b1,b2, a1)
);
CREATE TABLE dd
( d1 VARCHAR2(10),
d2 VARCHAR2(10),
c1 VARCHAR2(10),
b1 VARCHAR2(10),
b2 VARCHAR2(10),
a1 VARCHAR2(10),
PRIMARY KEY(d1, c1, b1, b2, a1),
FOREIGN KEY(c1, b1, b2, a1) REFERENCES cc(c1, b1,b2, a1)
);
아크 Arcs
- 아크란는 상호 베타적 relationship이다.
- 일반적으로 relationship은 상호 독립적이나 아크가 생기면서 relationship이 상호 베타적으로 바뀐다.
- ex) 은행계좌 - 법인 고객, 은행계좌 - 개인 고객
아크와 서브타입
- 서브타입 -> 아크 변환 무조건 됨
- 아크 -> 서브타입 변환 될 수도 있고 안될 수도 있음.
Boundaries
- 각각의 entity가 관련성이 하나도 없으며 그냥 참고용으로 만든다.
References
개발자님들 덕분에 많이 배울 수 있었습니다. 감사의 말씀 드립니다.