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
운영게시판
최근게시물
MySQL Q&A 27690 게시물 읽기
No. 27690
답변이 없어서 다시 질문 올립니다.
작성자
제로당(jero0208)
작성일
2008-07-22 15:54
조회수
4,090

안녕하세요.

이걸 해결해야 다음것을 할 수 있어서 다시 질문 올립니다.
아시는 분 계시면 좀 가르쳐 주세요!!
-----------------------------------------------------------------------
방송관련 테이블에서 다대다관계를 없애려고 합니다.


다큐멘터리,드라마,음악,버라이어티에 관한 테이블이 각각 있고

여기에 출연한 연기자테이블이 있습니다.

다큐멘터리 드라마 음악 버라이어티 연기자
키z 키x 키y 키w 키v
항목a 항목a 항목1 항목2 이름
항목c 항목c 항목2 항목3 성별
항목d 항목e 항목4 출생일
항목f 항목5 데뷰
항목6 ...

각 방송의 출연진에 대한 항목을 추가하려고 하는데 다대다 관계가 됩니다.

다대다일 경우의 정규화를 보면 출연진 테이블을 따로 만들어 하면 되겠다고 생각되는데

그렇게 하면 이런 테이블들이 만들어집니다.

다큐출연진 드라마출연진 음악출연진 버라이어티출연진
다큐키 드라마키 음악키 버라이어티키
연기자키 연기자키 연기자키 연기자키

방송 종류가 한두개가 아닌데 모든것에 대해 

위처럼 비슷한 구조의 간단한 출연진 테이블을

만들어야 한다는게 영 뭔가 아닌듯 싶습니다.

뭔가 방법이 없을까요?

아시는 분 계시면 좀 가르쳐 주세요~!

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

1.방송카테고리테이블(키a, 카테고리명) : 다큐멘터리, 드라마, 음악, 버라이어티 인지 표현

2. 방송테이블(키b, 방송카테고리테이블 키a, 항목a, 항목b, ..) : 무슨 방송인지

3. 연기자(키v, 이름, 성별, 출생일, ..) : 연기자

4. 방송과 연기자 출연테이블(키v, 키b, 출연날짜 등등) : 출연테이블


이렇게 4개로 구성하시면 어떨까요? 


버라이어티에 출연한 연기자를 찾고 싶다. 


select 연기자의 항목 from 

       (select 키b from 방송테이블 

           where 키a in 

            (select 키a from 방송카테고리테이블 where 카테고리명=버라이어티)) 방송키temp, 출연테이블

 

            where 출연테이블.키b=방송키temp.키b and

             출연테이블.키v=연기자.키v

          


sql 맞나? 암튼 버라이어티에 속하는 방송들을 찾고, 

그 방송들에 출연한 연기자들을 찾으시면 됩니다. 


1번 방송카테고리가 딱~정해져있다면(이것은 좀 위험하지만, .. 방송카테고리테이블에 정해진 코드값으로 넣기) 그것만 없애도 3개의 테이블로 구성할 수 있습니다.

 

    

 

앵양님이 2008-07-22 16:43에 작성한 댓글입니다.
이 댓글은 2008-07-22 16:44에 마지막으로 수정되었습니다. Edit

앵양님 답변 정말 고맙습니다.

그런데...각각 테이블에 컬럼 하나 둘 추가하는정도는 괜찮긴 하지만,

테이블 구조는 변경할 수 없습니다.

중복되는 컬럼이 있긴 한데 성격이 다른 테이블들이라

다른 내용들이 들어가는 컬럼이 많은 테이블이어서 합칠수가 없거든요.

제로당(jero0208)님이 2008-07-22 22:05에 작성한 댓글입니다.

사실 전에 이 질문을 보고 답변을 드릴까 말까 고민했던 기억이 나긴 합니다.


앞서 앵양님이 답변을 올리신 것처럼 table 구조를 뒤엎는 일이 가장 바람직하긴 하지만


사실 실무상에서 내가 담당이 되었을 시점에 저런 테이블로 구성되고 이미 사방군데에 테이블을 참조하는 웹페이지, 관리툴, 각종 job 등등이 걸려있어서 다 바꾸는 것이 몇 개월 project가 되어야만 하는 경우가 대부분이죠.


우선 test 코드 날라갑니다.



-- 하위의 각 테이블은 connector 테이블의 bctype(broadcasting type)의 comment를 참조

CREATE TABLE dc ( dckey int, some_info varchar(1) );

CREATE TABLE dr ( drkey int, other_info varchar(2) );

CREATE TABLE mu ( mukey int, another_info varchar(3) );

CREATE TABLE vs ( mskey int, the_info varchar(4) );

-- player info table

CREATE TABLE qq ( qkey int, birth date, etc_info char(4), PRIMARY KEY ( qkey ) );

-- program <-> player를 연결해주기 위한 테이블

CREATE TABLE connector ( 

tblkey int

, qkey int

, bctype ENUM( 'dc', 'dr', 'mu', 'vs' ) COMMENT 'dc for documentary, dr for drama, mu for music, vs for variety show'

, FOREIGN KEY (qkey) REFERENCES qq ( qkey ) );

-- sample program data inserting 

INSERT INTO dc ( dckey, some_info ) VALUES( 1, 'a' );

INSERT INTO dr ( drkey, other_info ) VALUES( 1, 'b' );

INSERT INTO mu ( mukey, another_info ) VALUES( 2, 'c' );

-- sample player data inserting

INSERT INTO qq ( qkey, birth ) VALUES( 1, '2007-01-01' );

INSERT INTO qq ( qkey, birth ) VALUES( 2, '2008-01-01' );

INSERT INTO qq ( qkey, birth ) VALUES( 3, '2009-01-01' );

-- drama #1 <-> player #1

INSERT INTO connector( tblkey, qkey, bctype ) VALUES( 1, 1, 'dr' );

-- drama #1 <-> player #2

INSERT INTO connector( tblkey, qkey, bctype ) VALUES( 1, 2, 'dr' );

-- music #2 <-> player #2

INSERT INTO connector( tblkey, qkey, bctype ) VALUES( 2, 2, 'mu' );


-- 다큐멘터리는 '동물의 세계'여서 출연자 없음,

-- 07년에 태어난 1번 연기자와 08년에 태어난 2번 연기자는 드라마 1번에 출연

-- 08년에 태어난 놈은 음악 2번에도 출연

--프로그램으로부터 연기자 정보를 뽑아내는 예제: 1번 드라마 출연자 몽창 땡겨오기

SELECT *

FROM dr INNER JOIN connector AS cntr ON dr.drkey = cntr.tblkey

INNER JOIN qq ON cntr.qkey = qq.qkey

WHERE bctype = 'dr'

AND dr.drkey = 1;

--연기자로부터 프로그램 정보를 뽑아내는 예제

SELECT 'dc' AS program_type, dc.some_info AS dinfo

FROM qq INNER JOIN connector AS cntr ON qq.qkey = cntr.qkey

INNER JOIN dc on cntr.tblkey = dc.dckey

WHERE cntr.bctype = 'dc' 

--       검색 조건이 2번 연기자의 정보를 가져와야 하는 경우 그러한 조건 추가

AND qq.qkey = 2

UNION ALL

SELECT 'dr', other_info

FROM qq INNER JOIN connector AS cntr ON qq.qkey = cntr.qkey

INNER JOIN dr on cntr.tblkey = dr.drkey

WHERE cntr.bctype = 'dr'

AND qq.qkey = 2

UNION ALL

SELECT 'mu', another_info

FROM qq INNER JOIN connector AS cntr ON qq.qkey = cntr.qkey

INNER JOIN  mu on cntr.tblkey = mu.mukey

WHERE cntr.bctype = 'mu'

AND qq.qkey = 2

--union joined tables

;

--이런 문장의 경우에도 또 다른 형식의 프로그램이 만들어지면 해당하는 형식을 표현하기 위한 테이블을 또 생성해야 하고, 위의 SQL 구문을 바꿔야하는(union all 추가) 불상사가 생기는 그다지 좋지 않아보이는 기존의 테이블 구조.. --_--;;


위와 같이 프로그램과 연기자의 PK를 담고 더불어 어떤 종류의 program인지(위의 connector 테이블의 경우에는 bctype)를 담는 정보를 추가한 테이블 정도로 만들면 하나의 테이블로 특별한 어려움 없이 관리는 가능하리라고 생각합니다만~~

그래도 심각하게 뒤엎는 걸 고려해 보시죠.. ^^;;


뱀꼬리: test sql문을 대충 만들고 보니 connector table의 bctype이 column의 순서상 맨 앞으로 땡겨지는 편이 좀 더 보기가 좋을거 같다는 생각.. ^.^;;

우욱님이 2008-07-23 14:46에 작성한 댓글입니다.
이 댓글은 2008-07-23 14:58에 마지막으로 수정되었습니다. Edit

우욱님 답변 감사드립니다!!
답변 주신 내용을 보며 며칠 고민해보고, 토론해 봤습니다만...
connector테이블의 bctype컬럼이 참조무결성에서 걸리는 점이 있어서
다른 방법으로 해결해야 할거 같습니다.
답변 너무 감사드리고, 오늘도 좋은하루 되세요^^

제로당(jero0208)님이 2008-07-25 13:28에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
27696MySQL 4.0.26 을 쓰고있는데요. character set 설정때문에 질문드립니다. [2]
송은우
2008-07-24
4611
27694mysql 저장데이터 관련 질문입니다.. [4]
김윤정
2008-07-23
4152
27693결석학생(?) 찾는 쿼리문 힌트좀 부탁드립니다. [1]
권순원
2008-07-23
3853
27690답변이 없어서 다시 질문 올립니다. [4]
제로당
2008-07-22
4090
27689auto_increment 항목 질문 입니다. [4]
유승효
2008-07-22
3692
27688카테고리별 최근글 가져오기 쿼리좀 봐주세요 --; [1]
이지은
2008-07-22
4011
27687Error in my_thread_global_end(): 1 threads didn't exit 이 에러요
김수정
2008-07-21
4809
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다