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


  • department_project

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




  • department_location

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 값은 카운팅하지 않습니다. )

  • 불필요한 storage를 낭비합니다.




+ Recent posts