维基百科中关于 3NF 的例子符合吗?
Is the example in wikipedia about 3NF conform it?
这是关于 normal forms taken from Wikipedia 的文章的屏幕截图。
声明为了符合 3NF
,Genre Name
列必须放入它自己的字典 table。
我的问题是,Author Nationality
breaking 3NF
也有吗?
是的,你是对的,Author Nationality
也打破了3NF。
说明如下。 Book
可以识别author
,反之则不行。因此 author
在功能上依赖于 book。 author
和 author nationality
也一样。 Author nationality
在功能上依赖于 author
。你有你的传递依赖:author nationality
-> author
-> book
。
本书 table 中可以优化的另一件事是列 thickness
。它在功能上依赖于 pages
。但是,将其放在额外的 table 中会有点矫枉过正,因为此信息可以很容易地从 pages
中导出。我个人不会将该信息存储在数据库中。如果你想在数据库中获得这些信息,你可以创建一个像
这样的视图
CREATE VIEW v_book AS
SELECT b.*,
case when pages between 0 and 100 then 'slim' else 'thick' end as thickness
FROM book b;
这本书 table 应该是这样的
book | author_id | pages | genre_id | publisher_id
与另一位 table 作者
author_id | author_name | author_nationality
这是关于 normal forms taken from Wikipedia 的文章的屏幕截图。
声明为了符合 3NF
,Genre Name
列必须放入它自己的字典 table。
我的问题是,Author Nationality
breaking 3NF
也有吗?
是的,你是对的,Author Nationality
也打破了3NF。
说明如下。 Book
可以识别author
,反之则不行。因此 author
在功能上依赖于 book。 author
和 author nationality
也一样。 Author nationality
在功能上依赖于 author
。你有你的传递依赖:author nationality
-> author
-> book
。
本书 table 中可以优化的另一件事是列 thickness
。它在功能上依赖于 pages
。但是,将其放在额外的 table 中会有点矫枉过正,因为此信息可以很容易地从 pages
中导出。我个人不会将该信息存储在数据库中。如果你想在数据库中获得这些信息,你可以创建一个像
CREATE VIEW v_book AS
SELECT b.*,
case when pages between 0 and 100 then 'slim' else 'thick' end as thickness
FROM book b;
这本书 table 应该是这样的
book | author_id | pages | genre_id | publisher_id
与另一位 table 作者
author_id | author_name | author_nationality