-1

我有点困惑如何在数据库图中检查 BCNF。我看到了一些关于什么是数据库规范化(1NF、2NF ......)的 youtube 视频,但是到了将这些规则应用于我的项目的时候,我不知道该怎么办 。

我的电影数据库的 ER 图

ER图到postgre sql代码:

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;

电影数据库设计的主要来源: 如何设计电影数据库?

因此,在给定的 ER 图上,我的目的是找到函数依赖关系并应用 BCNF 规范化。

任何帮助表示赞赏!

4

1 回答 1

0

实体-关系模型更像是一个概念模型而不是逻辑模型。它添加了语义,使得未经形式逻辑训练的人更熟悉它,同时将一个限制在关系模型的一个子集并产生合理的规范化关系。我们通常不处理 ER 级别的规范化 - 实体和关系仅使用单个主键设计,其他一切都是这些键的依赖项,没有表示替代候选键或部分或传递功能依赖项的符号。此外,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 图中包含关系中的关键属性而创建的?通常我们理解一个关系的key是由参与关系的实体的key组合而成的,所以我们不会在图上注明。

我还删除了每一列的唯一约束。想想看 - 每部电影只有一个角色吗?每个人在他/她的生活中只能扮演一个角色吗?每个角色只能执行一次吗?每部电影是否只属于一种类型?每个流派是否只包含一部电影?这些限制没有意义。

此外,在您的图表上,(0,N)基数指标没有意义。0通常表示关系的可选组件。可以在没有和/或的film_genre情况下记录实例吗?不,每个关系实例都需要两个实体。除非指明,否则通常假定 ER 关联是不受约束的,因此我曾指出的唯一基数是关系中的实体是依赖的而不是键的一部分。对于可选关联,我使用虚线。movie_idgenre_id1

回到你的问题,花点时间考虑一下这种film_people关系,这里可能违反了 BCNF,这取决于你如何解释这种情况。是否存在隐藏的重叠候选键?例如,两者都是(movie_id, person_id)唯一(movie_id, role_id)的吗?换句话说,一个人可以在电影中只扮演一个角色,而电影中的每个角色只能由一个人扮演吗?以同样的方式思考(movie_id, role_id)和思考(role_id, person_id)

最后,还要考虑一下您的ON DELETE CASCADE条款。如果您删除一个人,它也会从电影中删除相关角色。如果您删除一个角色,它将删除一个人与电影的关联。那是对的吗?

于 2016-12-30T12:31:48.367 回答