2016-06-16 8 views
3

데이터베이스 디자인을 올바르게 얻으려고합니다. 그것은 맥주, 술, 와인 등으로 구성된 알코올 음료의 큰 집합입니다. 다음과 같이 나는 하나의 테이블에 모두 유지할 수 :종속성을 줄이기 위해 데이터베이스 정규화

id category brand  type price quantity description 

1 Beer  Heineken bottle $2.00 100  some description... 
2 Beer  Calsburg bottle $3.00 200  some description 
3 Beer  Heineken can  $1.00 300  some description.... 
4 Liquor JWalker bottle $30.00 100  some descri... 

이이 발생할 카테고리 및 브랜드에 대한 반복을 고려 나쁜 디자인 같다.

분류 표

id name(pk) 

1 Beer 
2 Liquor 

브랜드 표

id name(pk) category_name(FK) 
1 Heineken Beer 
2 Carlsburg Beer 
3 Lindemans Wine 
4 JWalker  Liquor 

제품 표

id(PK)  type price quantity description  category_name(FK) brand_name(FK) 
1   Bottle $2.00 100   some description Beer    Heineken 
,536을 다음과 같이 따라서 나는 3 개 테이블로 분할

생각하면 정규화 된 방식이 좋지만 첫 번째 표와의 차이는 거의 없습니다. 그리고 나는 병, 깡통 등등에 반복을 얻을 수 있기 때문에 너무 repeatnig 유형으로 끝난다. 내가 4 번째 테이블을 얻어야 하나?

가능한 한 합리적인 수준으로 유지하십시오. 이 작업을 수행하는 더 좋은 방법이 있습니까?

create table product (
    product_id int not null identity, 
    brand_id int not null, 
    category_id int not null, 
    primary key(product_id), 
    foreign key brand_id references brand(brand_id), 
    foreign key category_id references category(category_id) 
); 

create table brand (
    brand_id int not null identity, 
    name varchar(80), 
    primary key(brand_id) 
); 

create table category (
    category_id int int not null identity, 
    name varchar(80), 
    primary key(category_id) 
); 

당신은 다시 기록을 얻기 위해 가입 않습니다 :

+0

외래 키 값은 값이 아니라 상위 테이블의 행 ID 여야합니다. – duffymo

+1

OP가 지적한 것처럼 브랜드 나 카테고리와 관련된 추가 데이터가 없기 때문에 테이블을 분리하는 데별로 이점이 없습니다. 그렇지만 항상 고유 한 경우 PK로 이름을 사용하는 것이 좋습니다. – mhatch

+1

Say Heineken이 다른 회사에 의해 매수/매매되고 /되거나 다른 브랜드로 변경되었습니다. 모든 제품을 업데이트하거나 브랜드 테이블에서 하나의 레코드 만 업데이트하고 싶습니까? 단일 테이블은 유혹을 불러 일으킬 수 있지만 장기간 유연성을 떨어 뜨립니다 (축소하지는 않지만 추가 작업을 추가 할 수도 있음). 이 시스템의 변화가 어떻게 진행될 계획입니까? 그렇다면 가능한 한 3/4에 가깝게 얻으십시오. *** 만약 *** 이것이 정말로 될 것이며, 당신이 변화를 예상하지 않는다면, 단일 테이블은 유지 보수가 더 어렵다는 "빠른"것입니다. – xQbert

답변

-2

테이블 생성은 다음과 같이 보일 것이다

select p.product_id, c.name as category_name, b.name as brand_name 
from product as p 
join category as c on p.category_id = c.category_id 
join brand as b on p.brand_id = b.brand_id 
+0

나는 당신이 무슨 말을하고 있는지 전혀 모릅니다. 이 경우 외래 키가 어떻게 보이는지 보여주는 예제입니다. 정규화가 의미하는 바를 검토해야합니다. – duffymo

+0

새 열을 추가하지 않았습니다. MN 이름. 나는 두 개의 테이블을 만들었고 하나는 카테고리 용으로, 다른 하나는 브랜드 용으로 만들었고 제품 테이블을 외래 키로 가리켰다. 나에게 고전적으로 보인다. – duffymo

+1

질문은 "가능한 한 합리적인 수준으로 유지하려고 노력하고 있습니다. 더 나은 방법이 있나요?" 원래 표는 5NF입니다. 질문의 두 번째 디자인은 정규화의 산물이 아닙니다. 그것은 어쨌든 새 컬럼 : ID를 도입했기 때문에 그렇게 될 수 없습니다. 당신의 대답은 마찬가지입니다. 하나는 ID를 추가 할 수 있습니다. 하지만 정상화가 아닙니다. 추신 : 그냥 내 대답을 downvoted 경우, 당신이 잘못 생각하고 내가 내 대답을 보여주는 레퍼런스를 추가 할 것입니다 먼저 올바른 말해 줘. 아니면 정규화에 대한 교과서 나 슬라이드 (온라인으로 많은 자료)를 읽으십시오. – philipxy

0
Brand Table 
brandID(PK) BrandName 

Category table 
BrandID(FK) CategoryID(PK) Categoryname 

Product table 
ProductID(PK) CategoryID(FK) description price quantity 
+1

카테고리는 브랜드와 관련이있을 필요는 없지만 BrandID는 외래 키로 제품에 속합니다. – Philipp

0

정상화 함수 종속 (FDS)을 알고 요구 및 종속성에 가입 (JDs)를 보유하고 있습니다. 당신은 그들에게주지 않았습니다. 그래서 우리는 정상화 할 수 없습니다. 하지만 응용 프로그램과 테이블에서 추측하면 5NF입니다.

아마도 id는 고유 한 열입니다. 따라서 모든 열 집합을 기능적으로 결정합니다. {id}의 더 작은 하위 집합이 고유하지 않으므로 후보 키 (CK)입니다. 아마도 다른 FD는 그 CK로 인해 보유하고있는 것 이외의 다른 FD를 보유하지 않을 것입니다. 테이블은 5NF입니다.

그러나 한 가지 더 많은 FD가 있다고 가정 해보십시오. 주어진 브랜드는 동일한 카테고리에서만 나타납니다. 그런 다음 5NF 열로 정규화하려면 카테고리를 삭제하고 브랜드 테이블에 & 카테고리 열과 CK {brand}라는 새 테이블을 추가해야합니다.

브랜드에 하나 이상의 카테고리가 있고 해당 카테고리가 제품 카테고리라는 행 대신에 해당 카테고리가 제품 브랜드의 카테고리라고되어 있다고 가정합니다. (그때 이래로 하나 이상의 카테고리가있는 브랜드의 경우 제품 카테고리를 제공하지 않을 것입니다.) 그런 다음 정규화를 통해 새로운 CK {카테고리, 브랜드}가있는 두 테이블이 제공됩니다. 하지만이 경우 다중 값 종속성 (MVD) 때문입니다. 즉, 바이너리 JD 때문입니다.

PS ids 소개는 정규화와 아무 관련이 없습니다.

PPS 반복 된 하위 값은 정규화의 필요성을 암시한다고 생각되는 것 같습니다. 그들은하지 않습니다. 정규화는 때때로 테이블에 항상 참여하는 테이블로 테이블을 대체하기위한 것입니다.

-1

BCNF를 통한 정규화는 기능 종속성을 기반으로합니다. 열에 텍스트 나 숫자가 포함되어 있는지 여부에 기반하지 않습니다. 카테고리 열에 단어 Beer가 두 번 이상 포함되어 있기 때문에 "정규화"해야한다고 생각하는 것 같습니다. 그건 사실이 아니야.

여기에 함수 종속성은 무엇입니까?

  • ID -> 카테고리, 브랜드, 종류, 가격, 수량, 설명
  • 카테고리, 브랜드, 유형, -> ID, 가격, 수량, 설명을

초 FD가 잘못 하심 . {브랜드, 유형}이 결정 요인 일 수 있습니다. 그러나 맥주와 주류를 동일한 브랜드로 만드는 어딘가에있는 회사가 있다고 생각합니다. 그래서 나는 결정자가 아마도 {category, brand, type}라고 생각합니다.

그건 이미 5NF에 있습니다. "분할"은이 표를 개선하지 않습니다.