dev_hun
2023. 2. 8. 11:26
2023. 2. 8. 11:26
Insert anomalies
empl_id |
empl_name |
birth_date |
position |
salary |
dept_id |
dept_name |
dept_leader_id |
1 |
MESSI |
... |
... |
... |
1001 |
DEV |
1 |
2 |
JINHO |
... |
... |
... |
1001 |
DEV |
1 |
3 |
JENNY |
... |
... |
... |
null |
null |
null |
4 |
null |
null |
null |
null |
1002 |
QA |
null |
5 |
YUGIN |
... |
... |
... |
1002 |
QA |
5 |
- 위와 같이 스키마가 설계되었을 때 아래와 같은 이상현상이 발생될 수 있습니다. ( empl_id는 primary key입니다. )
중복 데이터 문제
- dept_id, dept_name, dept_leader_id 속성은 중복 데이터이며, 중복 데이터는 저장 공간을 낭비시킵니다.
- 개발자의 실수로 인한 데이터 불일치 가능성이 존재합니다.
null 값을 많이 써야되는 문제점
- 3번째 튜플을 보면 아직 부서 배정을 받지 못하여 dept_id, dept_name, dept_leader_id의 속성이 null 값으로 채워진 것을 볼 수 있습니다.
- 4번째 튜플을 보면 아직 부서원이 없는 부서를 insert할 때 직원 관련된 속성은 null 값으로 채워야하며, primary key에는 임시로 값을 넣어줘야 합니다.
- 5번째 튜플로 신생 부서의 부서원을 추가하였다면 신생 부서 생성을 위한 튜플 4번을 삭제해야하는 추가적인 작업이 필요합니다.
Deletion anomalies
empl_id |
empl_name |
birth_date |
position |
salary |
dept_id |
dept_name |
dept_leader_id |
1 |
MESSI |
... |
... |
... |
1001 |
DEV |
1 |
2 |
JINHO |
... |
... |
... |
1001 |
DEV |
1 |
3 |
JENNY |
... |
... |
... |
null |
null |
null |
5 |
YUGIN |
... |
... |
... |
1002 |
QA |
5 |
- 위와 같이 스키마가 설계되었을 때 아래와 같은 이상현상이 발생될 수 있습니다. ( empl_id는 primary key입니다. )
의도하지 않은 데이터 삭제
- 4번째 튜플을 삭제하게 될 경우 QA부서에 대한 데이터 또한 삭제되는 문제가 발생됩니다.
Update anomalies
empl_id |
empl_name |
birth_date |
position |
salary |
dept_id |
dept_name |
dept_leader_id |
1 |
MESSI |
... |
... |
... |
1001 |
DEV |
1 |
2 |
JINHO |
... |
... |
... |
1001 |
DEV1 |
1 |
3 |
JENNY |
... |
... |
... |
null |
null |
null |
- 위와 같이 스키마가 설계되었을 때 아래와 같은 이상현상이 발생될 수 있습니다. ( empl_id는 primary key입니다. )
데이터 불일치 현상
- 만약, DEV 부서 이름이 DEV -> DEV1로 변경되었다면, 프로그래머의 실수로 JINHO가 속한 튜플만 변경될 수도 있습니다. 이렇게 될 경우 부서 정보의 데이터 불일치 현상이 발생될 수 있습니다.
다음과 같은 테이블 설계가 좋지못한 이유
empl_id |
empl_name |
birth_date |
position |
salary |
dept_id |
dept_name |
dept_leader_id |
1 |
MESSI |
... |
... |
... |
1001 |
DEV |
1 |
2 |
JINHO |
... |
... |
... |
1001 |
DEV |
1 |
3 |
JENNY |
... |
... |
... |
null |
null |
null |
4 |
null |
null |
null |
null |
1002 |
QA |
null |
5 |
YUGIN |
... |
... |
... |
1002 |
QA |
5 |
- 두 가지 이상의 관심사인 employee, department에 대한 정보가 한 테이블에 있기 때문입니다. 그래서 위 테이블을 다시 설계를 한다면 employee와 department 테이블을 나눠서 설계헤야합니다.
Spurious Tuples
dept_id |
proj_id |
proj_name |
proj_location |
1001 |
2001 |
Beautiful Jeju |
Jeju |
1001 |
2003 |
Busan romance |
Haeundae |
1002 |
2002 |
Wedding at Jeju |
Jeju |
1003 |
2004 |
Again 2002 |
Gwanghwamun |
dept_name |
proj_location |
feelm |
Jeju |
feelm |
Haeundae |
Picachoo |
Jeju |
MovieMove |
Gwanghwamun |
- 위와같이 사진 촬영회사의 DB 테이블을 설계하였다고 가정하였을 때 아래와 같은 이상 현상이 발생될 수 있습니다.
select * from department_project natural join department_location
dept_id |
proj_id |
proj_name |
proj_location |
dept_name |
1001 |
2001 |
Beautiful Jeju |
Jeju |
feelm |
1001 |
2003 |
Busan romance |
Haeundae |
feelm |
1002 |
2002 |
Wedding at Jeju |
Jeju |
Picachoo |
1003 |
2004 |
Again 2002 |
Gwanghwamun |
MovieMove |
1001 |
2001 |
Beautiful Jeju |
Jeju |
Picachoo |
1002 |
2002 |
Beautiful Wedding |
Jeju |
feelm |
- 위 테이블은 natural join을 했을 때 결과입니다. 하지만, 두 번째, 다섯 번째 튜플을 보면 동일한 dept_id인데도 불구하고 dept_name이 다른 것을 확인할 수 있습니다. 이러한 튜플은 세 번째 여섯 번째 튜플 또한 같습니다. 즉, 잘못된 테이블 설계로 인해서 가짜 튜플이 생성된 것을 확인할 수 있습니다.
null 값이 많아짐으로 인한 문제점들
- null 값이 있는 column으로 join하는 경우 상황에 따라 예상과 다른 결과가 발생될 수 있습니다.
- null 값이 있는 column에 aggregate function을 사용했을 때 주의가 필요합니다. ( attribute를 대상으로 count를 사용할 경우 null 값은 카운팅하지 않습니다. )