database.sarang.net
UserID
Passwd
Database
ㆍDBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
DBMS Q&A 103 게시물 읽기
No. 103
DB 디자인시 데이터 중복과, 편리성의 문제
작성자
김재성(lovecpl)
작성일
2001-11-30 15:57
조회수
14,048

안녕들 하세요..

 

고수님들,, 특히 DB design에 고수이신 여러님들께 질문 드립니다.

다소 내용이 길지도 모르겠으나.. 꼭 좀 읽어 보시고,, 답변 부탁드립니다.

 

 

다음과 같이 3개의 테이블이 있다고 할 때...

 

(고객) (계열[VISA/MASTER]) (카드번호)

 

조건: 1명의 고객은 VISA카드를 여러장 가질 수도 있고,

또 MASTER카드도 여러장 가질 수 있다.

 

따라서 관계는 고객:계열 = 1:2

계열:카드 = 1:N

 

이렇게 설계가 되어있는데요...

 

그런데 문제는 현재 설계되어있는 테이블이 중복된 컬럼이 많다는 겁니다.

이를테면,, 카드소유자 성명이 고객테이블에도 있고, 계열테이블에도, 또

카드테이블에도 있습니다. 물론 컬럼이 중복되서는 안될테니만...

이유는 간단합니다. 만약 특정한 카드번호를 이용해 그 카드의 소유자

이름을 알고 싶다면 굳이 JOIN을 하지않고 그냥 카드테이블만 읽어서

이름을 찾겠다 이거죠.

 

그도 그럴것이 각각의 테이블의 크기가 몇 백만건 정도 된다면

이름 하나를 찾기 위해서 3개의 테입블을 JOIN해야 하는가라는

문제에 부딛히게 되거든요.. (정규화 논리상 이름은 고객테이블에만

있어햐 한다는 조건하에...)

 

 

그럼,, 질문 드리겠습니다.

과연 이름이라는 컬럼은 고객테이블에만 있어야 하고 항상 JOIN을

통해서 찾아야 한다. (=중복을 없애야 한다.) 라고 했을 때

시간과 서버의 부하가 많이 갈까요? JOIN땜에??

 

아니면,, 트리거를 이용해 성명이 바뀌면 다른 테이블의 성명컬럼도

바꿔주는 방법을 이용해서라도 그냥 각각의 테이블에 모두 갖고 있어

굳이 JOIN을 통하지 않고라도 쉽게 찾는다...

 

이 두가지 중 어떤것이 옳고 타당할런지요..

 

고수님들의 답변 부탁드립니다...

 

 

참고로,, 현재 저희 회사에서는요 ....

그냥 각각의 테이블에 이름을 두고,, application에서 이름변경 등의 거래가 들어오면 모든 테이블의 성명컬럼을 모두 바꿔준다.

=(모든 데이터 정당성은 프로그래머가 책임진다)

뭐 이런 식으로 되어있거든요.

 

그래서 이번에 싹 뜯어 고치고 설계부터 다시 하는데

이 부분에서 선배(파일시스템에 익숙해 있는)와 의견 충돌이 있어서요...

 

저는 1번 의견이고, 선배는 3번 내지는 2번 의견이죠..

 

긴 글 읽어 주셔서 감사하고요.. 답변 부탁드립니다...

이 글에 대한 댓글이 총 2건 있습니다.

^^

저 같으면 계열을 카드에 포함 시켜 버리고

고객과 카드의 1:N관계만 이용하겠네요. ^^

 

복잡한 조인의 경우 문제가 있겠지만..

1:N정도의 조인은 쿼리만 옵디마이징 한다면

부하가 거의 단순 쿼리 수준입니다.

 

DB 설계는 입력 / 수정 / 삭제 빈도를 모두 고려해야 겠죠.

박인호님이 2001-12-03 18:06에 작성한 댓글입니다.

고객이름이 고객정보 테이블과 카드정도테이블에 중복을 시켰다.

 

그런데 누가 고객정보테이블의 이름은 안바꾸고 카드정보 테이블의 이름만 바꾸었다고 합니다.

(물론 이름이 바뀌는 것이 흔하지는 않지만서리..)

 

과연 믿을 만한 정보를 가지고 있다고 말할 수 있을까요? 똑같은 고객코드를 가진 튜플을 과연 어떤 이름을 믿어야 할까요? 한 이름이 틀려서 고객의 불만이 접수되면 어쩌지요?

 

이름이 틀린 경우는 고객불만만 접수해 변경해 주면 되겠지만서리... 기타 다른 Attribute의 테이블간 중복으로 인해 DB의 무결성이 훼손된 다면 DBA조차 정보를 믿지 못하는데 그걸 쓰는 사람은 그 정보를 가치있게 사용할 수 있을까요?

 

물론야.. 테이블간에 특별한 트리거를 사용해서 Insert나 Update시에 테이블간의 같아야 하는 Attribute를 동기화해 줄 수 있을껍니다. 매우 좋은 방법이죠~!

 

다만 이런 튜플이 많아지면 관리상의 문제가 있겠죠~ 락을 많이 사용해야 할 판이니 아무래도 성능도 떨어지고..

 

데이터의 중복은 최대 마지막의 대안입니다. 최대한의 3차 정규화를 하신다음 클러스터도 생각해 보시고 인덱스도 연구하시고 업티마이져도 믿어 보세요

짧은 생각이었습니다.

김대성님이 2001-12-14 22:44에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
118눈물로 호소합니다...ㅠ.ㅠ
남규한
2001-12-03
14206
163┕>Re: 눈물로 호소합니다...ㅠ.ㅠ
김동아
2001-12-12 11:50:14
12441
115데이터베이스 관련 저널 URL
정재익
2001-12-03
13056
105관계에서요 키 설정하는 부분이 이상해서요. [2]
언제나
2001-12-02
15554
103DB 디자인시 데이터 중복과, 편리성의 문제 [2]
김재성
2001-11-30
14048
106┕>Re: DB 디자인시 데이터 중복과, 편리성의 문제
허정수
2001-12-02 14:55:12
13551
119 ┕>Re: Re: DB 디자인시 데이터 중복과, 편리성의 문제
jongwoo.han
2001-12-03 13:01:42
13776
102ER-WIN에 대해 아시는 분좀 봐주세요.
이종성
2001-11-30
12855
101오라클,mssql,mysql 에 대한 성능비교?? [2]
김명현
2001-11-29
16750
95흑 정말 모르겠습니다. 고수님들께~!! [1]
후니
2001-11-27
10125
96┕>Re: 흑 정말 모르겠습니다. 고수님들께~!!
허정수
2001-11-27 22:51:06
10393
97 ┕>Re: Re: 허정수님 답변이 ^^?
후니
2001-11-28 09:08:05
10711
99┕>Re: 흑 정말 모르겠습니다. 고수님들께~!!
김동아
2001-11-29 00:22:30
10409
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.024초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다