2010-12-14 2 views
2

정규화의 이점 중 하나는 DB의 중복성을 줄이는 것입니다. 하지만 당신이 목표 테이블의 모든 컬럼을 참조하게된다면 궁금합니다.모든 열을 참조하는 경우 외래 키가 중복성을 줄입니까?

예를 들어 Genre 테이블을 참조하는 Video 테이블이있는 경우 Genre 테이블에는 '공포', 'Sci-Fi', 'Romance'등과 같이 상당히 정적 인 값이있는 열이 하나있을 수 있습니다.

이와 같은 경우 두 공간을 구분하는 데 필요한 공간을 절약 할 수 있습니까? 아니면 모든 참조 행을 한 곳에서 업데이트 할 수있는 유일한 이점입니까?

답변

3

오른쪽 공간 절약은 입니다. ONE은 유일한 혜택이 아닙니다.

당신이 언급 한 경우에, 아니, 그 한 열을 PK로 사용하면 아무런 공간도 절약 할 수 있습니다.

자동 숫자/시퀀스를 사용하여 해당 테이블을 추상화하고이를 PK로 사용하고 현재 열을 후보 키로 지정하여 고유하게 유지할 수 있습니다.

그러나 앞서 설명한대로 디자인을 그대로두면 이점이 일관성있게 유지됩니다. 당신은 그 12 개의 가치만을 가질 것입니다 ...실수로 "Horrer"또는 "PSY-Fi"에 대한 값을 입력하지 마십시오

+0

많은 좋은 답변. 모두에게 감사드립니다! 가난한 Joe Celko는 여기에있는 모든 대리인들에게 겁을 먹을 것입니다. D 귀하는 저의 투표를 신중하게 읽고 신속하고 분명하게 답변했기 때문에 제 투표 결과를 얻었습니다, Stephanie. – labyrinth

+1

감사합니다. 필자는 프로그래머 유형의 사람들이 규칙을 극한으로 생각한다고 생각합니다. 항상 x를 수행하면 영원히 그리고 아멘을 의미합니다. 그러나 저는 왜 사람들이 항상 x를한다고 말하는지 이해할 필요가 있다고 생각합니다. 그 이유는 왜 그런지 알 수 없기 때문입니다. –

0

나는 대리 키 (Autonumber, Identity 등)를 사용하여 실제 값 대신 외부 키 조인에 사용합니다.

아이디어는 공간 축소보다 데이터 품질에 관한 것입니다.

대부분의 DB를의의 int는 VARCHAR2보다 작은 것 (20)

-1

'공포'는 유니 코드에서 12 바이트를 필요하기 때문에 GenreId이 될 수 있지만 당신은 또한 저장하는 바이트 또는 문자 (1).

+0

바이트? 숯? 조회가 255 개의 값을 초과하면 어떻게됩니까? –

+0

genreld 란 무엇입니까? –

+0

@Stephanie : 장르 ID –

0

예, varchar (20) 대신 video table에서 사용할 대리 키 (int)가 있거나 genra가 무엇이든지간에 공간을 절약 할 수 있습니다.

0

하지만 당신은 문제가 자신을 공격했습니다

상당히 정적 값 '공포' '공상 과학' '로맨스'등

같은 다스와

하나의 열 서로 게이트 키와 정규화 된 테이블을 사용하면 데이터베이스에 한 번만 "호러"가 저장되지만 ID 번호는 여러 위치에 저장됩니다 (단순한 숫자는 대부분의 텍스트보다 작으며 공간을 절약합니다). 데이터베이스의 유지 보수 가능성을 높일뿐만 아니라 실제로 원시 공간을 절약합니다.

+0

그는 PK로 값을 사용하고있었습니다. 그는 모든 칼럼을 참조하고 있다고 말했고이 경우 칼럼 만 언급했습니다. –

0

비디오 테이블의 행에 장르에 대한 유효/미리 결정된 항목이 있는지 확인하려면 어떻게해야합니까? 외래 키 제약 조건이 없다면 비디오 테이블의 해당 열에 대한 열거 형이 필요하며 Genre 테이블에 새 행을 추가하는 대신 새 Genre를 추가 할 때마다 스키마를 변경해야합니다.

+0

열거 형이 SQL 구조체라는 것을 전혀 알지 못했습니다. 어떤 ANSI SQL 표준이 그것입니까? –

+0

나는 그것이 perse라고 생각하지 않는다 : enum은 외래 키를 가지지 않고 값을 제한하는 방법이 될 것이다. –

0

그런 경우 키 값과 색인이 데이터 자체보다 훨씬 클 수 있습니다. 이와 같은 간단한 코드를 작성하는 또 다른 모델은 코드 테이블을 가지고 삽입 확인 및 업데이트 확인 제약 조건을 적용하여 유효성을 검사하는 것입니다. 또한 장르 데이터를 빼내기 위해 조인을 피합니다. 어떤 방법을 사용 하느냐에 따라 응용 프로그램 쿼리가 어떤 경향이 있는지에 따라 달라집니다.

2

절약 된 공간은 2 개의 테이블을 분리하는 것의 한 가지 이점입니다. 전에 말했듯이 "Horror"나 "Adventure"와 같은 실제 값 대신 Genre_ID를 넣으면 공간이 절약됩니다.

제 의견으로는 무결성을 유지하기 위해이 작업을 수행하는 것이 좋습니다. 비디오 테이블에 텍스트 값을 입력하면 우연히 값을 변경하지 못하게하는 요인은 무엇입니까? 이제 일부 행에는 '어드벤처'또는 '액션/어드벤처'등이있을 수 있습니다. 2 개의 테이블을 가지고 외래 키를 참조함으로써 장르가 될 수있는 값을보다 효과적으로 제어 할 수 있습니다.

요약하면 특히 테이블에 매우 적은 수의 열이있는 경우 모든 열을 참조한다는 사실에 대해 걱정할 필요가 없습니다. ID 필드를 추가하거나 1 열 테이블을 "수용 가능한 값"목록으로 유지하려는 경우 목표는 무결성을 먼저 적용하고 공간 또는 입출력 비용을 절약하는 것입니다.

+0

답변을 2 번 투표 할 수 있기를 바랍니다. 당신은 빨리 대답했지만 Stephanie 's는 좀 더 명확 해졌고 요점은 - 제가 알았다면, FK가 공간을 절약하지 못할 것이라는 것을 당장 알았습니다. – labyrinth

+0

나는 그를 위해 선거를 추가했다. 좋은 투표이기 때문에 저에게서 10을 얻을 것입니다 ... –

+0

Stephanie의 대답은 정말로 더 명확하고 핵심입니다. 이것은 내가 항상 교과서를 읽음으로써 얻는 것입니다! – Jason

0

Data modification anomalies

  • 당신이 새로운 장르를 추가하면?
  • Sci-Fi는 SciFi와 같은가요?
  • Sci-Fi는 Sci-fi와 같은가요?

다른 장, 예를 들어 동일한 장르가있는 "Books"가 더 나빠질 수 있습니다.

0

정규화는 공간을 절약하는 것과 아무 관련이 없습니다. 그것은 특정 종류의 중복으로 발생할 수있는 잠재적 인 예외를 제거하는 것입니다. 정규화는 논리적 레벨을 정의하기 때문에 정규화 된 데이터베이스가 비정규 화되거나 정규화되지 않은 것보다 물리적으로 더 크거나 물리적으로 더 작을 수 있습니다.

정규화는 일반적으로 효율적으로 저장소로 변환해야하는 디자인을 만드는 것은 사실이지만 정규화에 암시 된 것이 아닌 DBMS의 기능에 실제로 해당됩니다.