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 273 게시물 읽기
No. 273
[질문]FK 의 설정에 대해서.
작성자
서준원(linuxqna)
작성일
2002-01-08 10:55
조회수
8,125

여태까지 막역히 DB를 써오다가 정확하게 공부하고 들어가려니 힘드네요

예를 들어서 설명해 드리겠습니다.

"책" Entity 가 있고, "저자" Entity가 있습니다.

각각의 애트리뷰트를 간단히 나타내면 다음과 같이 나타낼 수 있겠습니다.

 

---- 책-----

|#*ISBN |

| *저자이름 |

| 가격 |

------------

 

--- 저자 ---

|#*저자이름 |

| 주소 |

| 전화번호 |

------------

(# : 식별자, * : 필수애트리뷰트)

 

이렇게 두개의 Entity가 있다고 가정할때

이제 두 Entity간의 관계를 설정하려 합니다.

 

관계 1. [책 : 저자] 의 관계는 [일대일 관계]라 가정

관계 2. 책은 저자에 대해서 필수

저자는 책에 대해서 필수

 

일때

 

질문1. "책의 저자이름" 애트리뷰트가 저자 Entity 에 대해서 FK가 되는것이 맞는지?

질문2. 만약에 "저자"테이블에서 한개의 튜플을 지우려 한다면

아직 "책"테이블에는 저자를 참조하는 데이터가 남아 있기 때문에

지우지 못하는 상황이 일어나는것이 맞는지요?

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

책의 테이블에서 ISBN 이 PK 가 되는 것은 당연합니다. 유일하고, 중복될 수 없으므로 당연하다고 생각됩니다. 하지만 저자 테이블에서 저자이름이 PK 가 될수 없다고 생각합니다. 왜냐하면 만의 하나의 경우지만 같은 이름의 저자가 존재할 수 있다는 것이지요. (동명이인이 존재 가능하지요) 이럴 경우에는 PK 를 따로 id 라는 필드를 하나 만들어서 저자 별로 고유 ID 를 부여하고 그 ID 를 저자 테이블의 PK 로 삼아야 합니다. 그리고 책 테이블에서 두번째는 저자 이름을 넣을 것이 아니고 저자의 ID 를 FK 로 설정해서 넣어 줘야 겠지요.

 

복잡한 얘기는 아니었지요.

정재익(advance)님이 2002-01-08 12:08에 작성한 댓글입니다.

질문에 대해서 정확한 답변을 못드린 것 같아서 다시 정리해서 알려 드리겠습니다.

 

질문 1. ....

이 질문의 답변은 위에 드렸다고 생각됩니다. 성질상 FK 로 지정되는 것은 맞는데, 저자 이름 보다는 ID 를 정하는 것이 좋을 것 같군요. 만약 저자 이름은 항상 유일하다는 가정만 성립한다면 현재 그대로 하셔도 좋습니다.

 

질문 2.....

이 질문은 FK 의 성질을 약간 잘못 이해하신 질문 같습니다. FK 의 주는 PK 로 지정된 저자 테이블이지, 책 테이블이 아닙니다.

즉 책에서 테이블을 생성한다면

CREATE TABLE book (
   isbn text primary key,
   author_id text 
          REFERENCES author (author_id) MATCH FULL 
                ON DELETE SET NULL,
    price real
);

CREATE TABLE author (
    authorid int primary key,
    name text,
    phone_no text
);

 

이런식이 되겠죠. 이 경우 book 에서는 row 를 얼마든지 지워도 전혀 상관이 없습니다. 하지만 author 의 row 를 DELETE 할 경우가 문제가 되겠지요. 말씀하신대로 book table 에 FK 가 걸린 자료가 남아 있기 때문이죠. 하지만 위에서 처럼 ON DELETE 등의 구문에서 그때 author 의 자료가 DELETE 질때 취할 행동을 정해 주도록 되어 있습니다. 위의 예제의 경우 값을 NULL 로 설정해 주라고 해 두었죠.

 

이해를 하셨는지 모르겠습니다.

 

자세한 것은 메뉴얼을 한번 읽어 보시는 것이 좋을 것 같습니다.

정재익(advance)님이 2002-01-08 12:23에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
291한번에 찾는 like 는 없나요..?
이효택
2002-01-13
7682
287버클리 DB에 관한 질문
백민준
2002-01-11
7639
289┕>Re: 못찾으신 것 같군요. [1]
정재익
2002-01-13 08:44:32
7881
276[질문]추가적인 애트리뷰트가 필요할떄, 그것을 어떻게? [1]
서준원
2002-01-08
7648
277┕>답변 감사하고 수정된 질문 내용입니다.(죄송)-_- [1]
서준원
2002-01-09 08:26:08
8060
273[질문]FK 의 설정에 대해서. [2]
서준원
2002-01-08
8125
275┕>Re: [질문]FK 의 설정에 대해서. [1]
서준원
2002-01-08 13:25:36
8910
278 ┕>[질문]죄송.. 약간의 풀리지 않는 궁금점이 남아서
서준원
2002-01-09 09:02:06
8122
284  ┕>Re: [질문]죄송.. 약간의 풀리지 않는 궁금점이 남아서 [1]
김대성
2002-01-09 23:48:18
9089
267[질문]PK가 너무 많아서.. 설계가 잘못된 것인가요? [1]
서준원
2002-01-07
7838
268┕>Re: [질문]PK가 너무 많아서.. 설계가 잘못된 것인가요?
서준원
2002-01-07 16:23:14
8235
266[질문]주소록 스키마좀 봐주세요 [1]
서준원
2002-01-07
8549
271┕>Re: [질문]주소록 스키마좀 봐주세요
김대성
2002-01-08 00:56:59
8580
253C-ISAM A.dat, A.idx를 Access로 Loader [1]
김대철
2002-01-05
8032
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.026초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다