2016-12-28 15 views
-1

데이터베이스 다이어그램에서 BCNF를 확인하는 방법이 약간 혼란 스럽습니다. 데이터베이스 정규화 (1NF, 2NF ...)에 대한 YouTube 동영상을 보았지만 이러한 규칙을 내 프로젝트에 적용 할 때, 무엇을 해야할지 알지 못한다. 영화 데이터베이스 설계에 대한영화 데이터베이스에서 BCNF를 확인 하시겠습니까?

CREATE TABLE People ( 
    birth_date DATE NOT NULL, 
    last_name CHAR(30) NOT NULL, 
    name CHAR(30) NOT NULL, 
    person_id INTEGER NOT NULL, 
PRIMARY KEY (person_id)); 

CREATE TABLE Roles ( 
    role_id INTEGER NOT NULL, 
    role_name CHAR(30) NOT NULL, 
PRIMARY KEY (role_id)); 

CREATE TABLE genre ( 
    genre_id INTEGER NOT NULL, 
    genre_name INTEGER NOT NULL, 
PRIMARY KEY (genre_id)); 

CREATE TABLE Movies ( 
    movie_id INTEGER NOT NULL, 
    title CHAR(30) NOT NULL, 
    rating REAL NOT NULL, 
    release_date DATE NOT NULL, 
PRIMARY KEY (movie_id)); 

CREATE TABLE film_people ( 
    role_id INTEGER NOT NULL, 
    person_id INTEGER NOT NULL, 
    movie_id INTEGER NOT NULL, 
    FK1_movie_id INTEGER NOT NULL, 
    FK2_person_id INTEGER NOT NULL, 
    FK3_role_id INTEGER NOT NULL, 
PRIMARY KEY (FK1_movie_id, FK2_person_id, FK3_role_id), 
UNIQUE (role_id), 
UNIQUE (person_id), 
UNIQUE (movie_id)); 

CREATE TABLE film_genre ( 
    movie_id INTEGER NOT NULL, 
    genre_id INTEGER NOT NULL, 
    FK1_movie_id INTEGER NOT NULL, 
    FK2_genre_id INTEGER NOT NULL, 
PRIMARY KEY (FK1_movie_id, FK2_genre_id), 
UNIQUE (movie_id), 
UNIQUE (genre_id)); 

ALTER TABLE film_people ADD FOREIGN KEY (FK1_movie_id) REFERENCES Movies (movie_id) ON DELETE CASCADE ON UPDATE CASCADE; 

ALTER TABLE film_people ADD FOREIGN KEY (FK2_person_id) REFERENCES People (person_id) ON DELETE CASCADE ON UPDATE CASCADE; 

ALTER TABLE film_people ADD FOREIGN KEY (FK3_role_id) REFERENCES Roles (role_id) ON DELETE CASCADE ON UPDATE CASCADE; 

ALTER TABLE film_genre ADD FOREIGN KEY (FK1_movie_id) REFERENCES Movies (movie_id) ON DELETE CASCADE ON UPDATE CASCADE; 

ALTER TABLE film_genre ADD FOREIGN KEY (FK2_genre_id) REFERENCES genre (genre_id) ON DELETE CASCADE ON UPDATE CASCADE; 

홈페이지 소스 :

My ER diagram for a movie database

ER 다이어그램 SQL 코드 postgre하는 How to design a movie database?

그래서를 제공 ER 다이어그램에서, 내 목적은 기능 종속성을 찾을 수 있습니다 BCNF 표준화를 적용합니다.

도움을 주시면 감사하겠습니다.

+1

제발 : 귀하의 문제를 이미지가 아닌 텍스트로 보내주십시오. 정규화를 다루는 많은 대학/대학교 ex스 북/슬라이드가 온라인에 있습니다. BCNF에 관계를 두는 알고리즘이 있습니다. 그것은 입력에 기능 의존성 및 후보 키가 필요합니다 그들을 찾아주고. 당신이 할 수있는 결과와 칭의를 제공하십시오. [ask]를 읽으십시오. 재 숙제 포함. – philipxy

+0

@philipxy, 의견을 주셔서 감사합니다. 내 질문을 조금 편집했습니다 :) – Klainti

답변

0

엔티티 관계 모델은 논리적 모델보다 개념 모델입니다. 그것은 관계형 모델의 부분 집합으로 제한하고 합리적으로 정규화 된 관계를 생성하면서 형식 논리에 익숙하지 않은 사람들에게 더 익숙한 의미를 추가합니다. 엔티티와 관계는 하나의 기본 키로 설계되고 그 외 모든 것은 해당 키의 종속성이며 대체 후보 키나 부분적 또는 전이 함수 종속성을 나타내는 표기는 없습니다. 또한 ER의 추가 의미론은 정규화 할 때 방해가됩니다. 즉 엔티티 집합과 값 집합 간의 차이를 유지하는 데 논리적 가치가 없으며 엔티티 관계와 관계 관계 사이에는 논리적 가치가 없습니다.

정규화는 ER 모델을 관계형 모델로 변환 한 후 더 잘 확인하고 적용합니다. 이것에 의해, 나는 각 엔티티와 각 관계를 별도의 관계로 변환하고 기능적 종속성과 후보 키를 나열하는 것을 의미한다. 이들은 주로 ER 모델에서 직접 파생 될 수 있지만 숨겨진 자연 키 (특히 대리 키를 사용했을 때)를주의 깊게 살펴보고 중요하지 않은 속성 (특히 EER 복합 속성을 사용한 경우) 사이의 종속성을 찾아 조심하십시오 EER 다중 값 속성을 사용하는 경우 다중 값 종속성으로부터의 4NF 위반.

종속성을 나타 내기 위해 각 열과 상자 사이에 상자로 구성된 관계형 다이어그램을 그릴 수 있습니다. 텍스트로만 입력하는 것이 좋습니다.

genre: genre_id -> genre_name 
movies: movie_id -> title, release_date, rating 
film_genre: movie_id, genre_id ->() 

마지막 줄의 빈 괄호는 해당 관계에 키가 아닌 속성이 없음을 나타냅니다. ER 모델이 올 바르고 완벽하다고 가정하지 않고 올바르게 정상화하기 위해 보유하고있는 모든 후보 키와 종속성을 확인하고 시도하는 것이 중요합니다. 모든 후보 키와 기능적 종속성이 나열되면 일반 양식을 통해 검증 할 수 있습니다.

사실, 관계 관계가 실제 모델/SQL에서 올바르게 구현되지 않았습니다. 다음과 같아야합니다.

CREATE TABLE film_people ( 
    role_id INTEGER NOT NULL, 
    person_id INTEGER NOT NULL, 
    movie_id INTEGER NOT NULL, 
    PRIMARY KEY (movie_id, person_id, role_id), 
    FOREIGN KEY (movie_id) REFERENCES Movies (movie_id) ON DELETE CASCADE ON UPDATE CASCADE, 
    FOREIGN KEY (person_id) REFERENCES People (person_id) ON DELETE CASCADE ON UPDATE CASCADE, 
    FOREIGN KEY (role_id) REFERENCES Roles (role_id) ON DELETE CASCADE ON UPDATE CASCADE 
); 

CREATE TABLE film_genre ( 
    movie_id INTEGER NOT NULL, 
    genre_id INTEGER NOT NULL, 
    PRIMARY KEY (movie_id, genre_id), 
    FOREIGN KEY (movie_id) REFERENCES Movies (movie_id) ON DELETE CASCADE ON UPDATE CASCADE, 
    FOREIGN KEY (genre_id) REFERENCES genre (genre_id) ON DELETE CASCADE ON UPDATE CASCADE 
); 

중복 된 열을 제거했습니다. movie_idFK1_movie_id. 아마도 이들은 ER 다이어그램에서 관계에 핵심 속성을 포함 시켰기 때문에 생성 되었습니까? 일반적으로 관계의 키는 관계에 참여하는 엔티티의 키에서 결합되므로 다이어그램에 나타내지는 않습니다.

또한 각 열의 고유 제한 조건을 제거했습니다. 생각해보십시오. 각 영화마다 단 하나의 역할 만 있습니까? 각자의 인생에서 한 부분 만 연주 할 수 있습니까?각 역할을 한 번만 수행 할 수 있습니까? 각 영화는 단 하나의 장르에 속합니까? 각 장르에 단 하나의 영화 만 포함되어 있습니까? 그러한 제약은 말이되지 않았습니다.

또한 다이어그램에서 (0,N) 카디널리티 표시기는 의미가 없습니다. 0은 대개 관계의 선택적 구성 요소를 나타냅니다. film_genre 인스턴스를 movie_id 및/또는 genre_id없이 기록 할 수 있습니까? 아니오, 각 관계 인스턴스에는 두 엔티티가 필요합니다. ER 연관은 일반적으로 표시되지 않는 한 제약이없는 것으로 간주되므로 관계의 엔터티가 키의 일부가 아닌 관계의 엔터티 인 경우 필자가 나타내는 유일한 카디널리티는 1입니다. 선택적 연결의 경우 점선을 사용합니다.

질문으로 돌아 가면 film_people 관계에 대해 생각해보십시오. 상황을 어떻게 해석 하느냐에 따라 BCNF 위반이있을 수 있습니다. 숨겨진 중복 키가 있습니까? 예를 들어, (movie_id, person_id)(movie_id, role_id)은 고유합니까? 즉, 한 사람이 영화에서 하나의 역할만을 할 수 있고 한 사람이 영화에서 각 역할을 할 수 있습니까? 동일한 방법으로 (movie_id, role_id)(role_id, person_id)을 생각해보십시오.

마지막으로 귀하의 ON DELETE CASCADE 절에 대해서도 생각해보십시오. 사람을 삭제하면 관련 역할도 영화에서 삭제됩니다. 역할을 삭제하면 동영상과의 사람의 연관성이 삭제됩니다. 그 맞습니까?

+0

와우, 당신이 너무 많이 도와 줬어! 이제 모든 것이 합리적입니다 .Btw (0, N)은 (minvalue, maxvalue)를 의미하지만 유용한 주석을 입력하면 ER 다이어그램을 업데이트했습니다. [응급 다이어그램] (http://i.imgur.com/WZ3s7MR.jpg) – Klainti