2013-11-25 2 views
0

나는 SQL에 상당히 익숙하지 않기 때문에, 좋은, 나쁜, 더 나은 또는 최고의 디자인이 무엇인지 알기가 어렵다.정규화 된 테이블의 패턴

저는 Entity Framework 4.3과 함께 사용하고있는 SQL 2008 데이터베이스가 있습니다. 데이터베이스를 정상화하려고합니다.

내 디자인에는 2 개의 테이블 응용 프로그램과 수락 된 응용 프로그램이 있습니다.

AcceptedApplications는 단순히 응용 프로그램 테이블의 확장이며, AcceptedApplications 일뿐입니다. 여기에는 거부 된 응용 프로그램과 관련이없는 추가 정보 만 포함됩니다.

Application과 AcceptedApplications간에 외래 키 관계가 있으므로 AcceptedApplication을 삽입하기 전에 응용 프로그램이 있어야합니다.

그러나 나는 또한 그것이 허용되는지 아닌지를 나타 내기 위해 Application 테이블에 비트 필드를 두는 것을 고려하고 있는데, 이는 'IsAccepted'와 같습니다.

질문은 꼭 필요한 것입니까? 초보자 인 나는 ApplicationAccepted에 ID가 있는지 또는 2 개의 테이블을 togther에 조인하는지 단순히 확인하는 것 이상의 benfits (있는 경우)를 반드시 인식하지는 않습니다. 사용 측면에서 분석 /보고 목적으로 만 라이브 웹 사이트에서 거부 된 응용 프로그램에 대해 쿼리하지 않습니다.

+0

_Why_ 당신이 테이블을 비정규입니까? 일반적으로 데이터 불일치 오류가 발생할 위험이 있으며 성능 관련 문제를 해결하는 데에만 사용됩니다. 'AcceptedApplications'에 어떤 추가 속성이 있었는가요? 그리고 당신이 그 테이블을 제거한다면 어떻게 할 계획입니까? –

답변

0

IsAccepted 비트 필드가 더 적합합니다.

그러나 어떤 이유로 다른 응용 프로그램 테이블이있을 수 있습니다 (예 : 허용되는 프로세스 또는 거부 된 응용 프로그램의 경우), 다른 필드를 사용하면 현재 솔루션이 더 나은 것처럼 보입니다.

저는 이것이 거의있을 것으로 생각하지 않지만 실제 필요에 따라 유용하게 들릴 수도 있습니다.

두 솔루션 모두 세 번째 정규 형식입니다.

0

Application 테이블은 정보를 기반으로 필요 충분하기 때문에 두 테이블이 필요하지 않을 가능성이 있습니다. 그리고 AcceptedApplication 테이블에 추가하려는 필드, 즉 IsAccepted 필드는 Application 테이블에 간단히 추가 할 수 있습니다.

당신은 아마 당신의 응용 프로그램 테이블이 구조를 가질 수있다 :

테이블 : 응용 프로그램

ApplicationID, Applicant_Lastname, Applicant_Firstname, ApplyDate, IsAccepted, AcceptedDate 

Normalization의 키를 흥미롭게 primary key입니다. E.F. Codd가 말했듯이 나는 "키가 아닌 모든 키 (기본 키가 아닌)는 키 (사실 기본 키를 의미 함)에 키를 제공해야하며 키는"으로 표시해야합니다.

예를 들어, IsAccepted 필드는 실제적으로 기본 키 ApplicationID에 기능적으로 종속적 인 비 키이므로 해당 문제에 대해 새 테이블을 만들 필요가 없습니다.

개인적으로 처음 세 가지 정규 형식 즉, RePeaT (모음을 무시함)에 대해 니모닉 장치를 사용합니다.첫 번째는 반복 그룹 또는 다중 값 필드이며, 두 번째는 기본 키에 부분적으로 종속되며 마지막으로 일시 의존성이 없습니다.

제 1 정규형 (1NF)가 :

예 아니오 그룹 또는 다중 값 필드를 반복 :이 경우 CoursesTaken에서

+----------------------------------------------- 
    + CourseTakenID StudentID CoursesTaken 
    +----------------------------------------------- 
    + 1    101   CS100, CS102, CS103 
    + 2    102   MS100, CS101 

(학생과정을 복용)는 Multi-valued 필드없고 1NF의 위반입니다.

+----------------------------------------------- 
    + CourseTakenID StudentID CoursesTaken 
    +----------------------------------------------- 
    + 1    101   CS100 
    + 2    101   CS102 
    + 3    101   CS103 
    + 4    102   MS100 
    + 5    102   CS101 

또는 반복 그룹의 경우

, 그것과 같을 것이다 : 정규화으로

, 당신은 같은 CourseTaken (지금은 Course 테이블이 이미 있다는 것을 여기에 또한 가정입니다)라는 별도의 테이블을 만들 수 있습니다 이 :

+-------------------------------------------------------------- 
    + StudentID StudentLastName StudentFirstName CoursesTaken 
    +-------------------------------------------------------------- 
    + 101  Smith    John    CS100 
    + 101  Smith    John    CS102 
    + 101  Smith    John    CS103 
    + 102  Gilmore   Anna    MS100 
    + 102  Gilmore   Anna    CS101 

정상화하기 위해서는 상기와 동일하지만 당신 Student 표는 단순히 것 같습니다

0 123,158,

제 2 정규형 (2NF) : 이제 부분적인 의존

2NFprimary key 두 개 이상의 필드의 조합을 의미 composite primary key 것을 여기에 가정합니다.

예 : (고객의 주문 정보)

이제, 우리는 ProductName 이상이 경우 복합 차 OrderID의 키와 ProductID

+----------------------------------------------- 
    + OrderID ProductID ProductName  Quantity 
    +----------------------------------------------- 
    + 1  WM101  Washing Machine 1   
    + 2  EI201  Electric Iron  1 

이있는 주문 정보 테이블을 아래로 부분적으로는 ProductID에 의존하지만 OrderIDProductID은 아니며 composite primary key입니다.

따라서 ProductName을 제거하고이를 예를 들어 Product 테이블에 넣으면 정규화 할 수 있습니다.

Order Details 테이블 :

+---------------------------------- 
    + OrderID ProductID Quantity 
    +---------------------------------- 
    + 1  WM101   1   
    + 2  EI201   1 

Products 테이블 :

+---------------------------------- 
    + ProductID ProductName QuantityOnHand 
    +---------------------------------- 
    + WM101  Washing Machine 20   
    + EI201  Electric Iron  40 

3 정규형 (3NF) : 없음 일시적인 의존

예 : (고객과는 대응 영업 담당자 RepID 그래서 그것은 과도 및 기본 키가 아닌 직접적인 의존성이다 CustomerID 에 의존하면서 resentative) RepLastNameRepFirstName 및 상기 경우

+----------------------------------------------------------------------------------------- 
    + CustomerID CustomerLastName CustomerFirstName RepID RepLastName  RepFirstName 
    +---------------------------------------------------------------------------------------- 
    + 101   James    Grace    SR101 Bravo   Brave 
    + 102   Gordon    Ronald    SR102 Alpha   Alfonso 
    + 103   Moore    Jeff    SR101 Bravo   Brave 

RepID에 의존한다. 지금과 같을 것이다

+----------------------------------------- 
    + RepID RepLastName  RepFirstName 
    +----------------------------------------- 
    + SR101 Bravo   Brave 
    + SR102 Alpha   Alfonso 

그리고 당신의 Customers 테이블 :

그래서, 당신은 같을 것이다 SalesRep에 대해 별도의 테이블을 생성 정상화하는

+---------------------------------------------------------- 
    + CustomerID CustomerLastName CustomerFirstName RepID 
    +---------------------------------------------------------- 
    + 101   James    Grace    SR101 
    + 102   Gordon    Ronald    SR102 
    + 103   Moore    Jeff    SR101 
관련 문제