• 카테고리

    질문 & 답변
  • 세부 분야

    데이터베이스

  • 해결 여부

    미해결

도서관리 연습문제2 강의 질문입니다.

20.03.05 13:24 작성 조회수 175

3

고객 테이블의 성별에 Null 허용을 하지 않을 경우

성별 테이블 외 성구분용 테이블이 하나 더 필요하다고 하셨는데,

기존의 성별 테이블에 성별코드를 int로 바꾼 후

거기에 구분 값을 1, 2, 3으로 줘서

남자, 여자, 미정 이렇게 주면 되지 않나요?

꼭 동일한 용도의 테이블을 하나 더 만들어야 하는 이유를 모르겠습니다.

답변 5

·

답변을 작성해보세요.

1

넵 알겠습니다. 답변 주셔서 감사합니다 .^^

강의 잘 듣고 있습니다. 좋은 강의 감사합니다!

1

예 알겠습니다. 성구분 테이블은 필요가 없습니다. 기준 테이블로 둘 중 하나만 있으면 됩니다. 그러나 말씀하신대로 미정을 3번으로 정의하지는 않습니다. 어차피 성별 코드가 부모 키가 되고 이를 참조하는 쪽이 자식 테이블이 되기 때문에 자식쪽에 null이면 미정이라는 뜻이 자동으로 되겠지요. 따라서 성별코드 1,2만 있으면 됩니다. 

0

답변 감사드립니다.

그런데, 질문의 내용을 약간 다르게 이해하신 것 같습니다.

강의에서 그려주신 ERD는 다음과 같습니다.

여기에서 고객테이블의 성별 값을 제한하기 위한 성별 테이블의 값을 제한하기 위한

성구분 테이블이 추가로 필요한게 아니라,

성별 테이블이 고객테이블에 대해서 성별은 제한하는 역할을 하는 것으로 충분한게 아닌가 하는 질문이었습니다.

답변 주신 내용처럼

성별 테이블에

성별코드   성별
1                  남
2                  녀
3                  미정

이렇게 주면

고객 테이블의 성별에는 1, 2, 3외의 값이 들어올 수 없을 텐데,

별도로 동일한 성 구분 테이블이 추가로 필요한지에 대한 의문이 들었습니다.

0

또 하나, NULL에 관한 것입니다. 프로그래머들이 혼란스러워하는 것이 NULL입니다. 왜냐면 int 타입을 갖는 컬럼이 있다고 가정하면 프로그램에서 int 변수와 비교해볼 때 int 변수의 초기값은 0입니다. 그래서 대부분 초기값으로 -1을 넣어두는 프로그래머들이 있죠. 왜냐면 프로그램 로직에서 int 변수는 양수만 갖기 때문에 -1이면 어떤 값이 안 들어오는 의미로 해석하고 싶은 겁니다. 그래서 if (int_var == -1) ... 이렇게 체크해서 값이 들어왔는지 아니면 초기값 상태인지를 구분하기도 하죠.

그러나 데이터베이스에서 int 타입 컬럼은 NULL을 갖을 수 있습니다. 이것이 혼란을 주는 것이죠. int 타입이면 0 또는 -1을 주고 싶어하는 심리가 발동하는 것입니다. 그래서 c# 문법에서도 int ? var_name 과 같은 문법이 나왔죠. 즉, 프로그램에서도 int 타입이 NULL을 갖도록 만들어 주는 방법이 나온 겁니다. NULL이라는 것은 아무런 변화없이 어떤 값도 안들어왔다는 것을 보장해주는 표준화된 의미임을 아신다면 NULL을 두려워할 필요는 없습니다.

0

좋은 질문입니다. 1,2,3을 주는 것은 맞습니다. 그런데 int는 domain이 얼마나 클까요? 대략적으로 양수로만 21억개정도 값을 갖습니다. 혹시 4가 들어올 수 있다는 이야기입니다. 그럼 4는 여성일까요 남성일까요. 이런 오류를 막으려면 기준테이블이 필요한겁니다. 즉, 성구분 값의 범위를 제한하는 테이블이 부모 테이블이 되고 그것을 참조하는 자식테이블에 값을 넣는것이죠. 그게 제가 말씀드리는 부모없는 자식이 있으면 안된다는 이야기가 됩니다. 가령 부모 테이블에 1과 2의 값을 갖는 PK를 정의하면 이것을 참조하는 자식테이블에 3이 들어가고 싶어도 못들어갑니다. 

대부분 프로그래머들은 값을 입력받을 때 1과 2가 아니면 막아주면 되니까 부모 테이블이 없어도 된다고 주장합니다. 그러나 데이터베이스 설계는 그 자체로 완벽한게 원칙입니다. 프로그램의 도움을 안 받아도 허용되지 않는 값을 허용하지 않아야 한다는 것이죠. 그래서 부자지간을 갖는 1:M 테이블에서 1이 부모역할을 하는데 부모의 역할은 제한된 도메인을 제공하고 자식 테이블에서는 부모가 가지고 있는 값중 하나를 선택하도록 하는 목적으로 사용됩니다.