这是在线图书馆目录的简单数据库模型。如果可能的话,我正试图将其标准化。您认为我应该改变什么或做些什么?
例如,我不确定表作者。它只有一个列“name”,它也是一个主键,我也将它用作另一个表中的外键。这是一个好习惯吗?我还应该在那里放两列(“first_name”和“last_name”)而不是一列?
CREATE TABLE books (
isbn VARCHAR2(13) NOT NULL PRIMARY KEY,
title VARCHAR2(200),
summary VARCHAR2(2000),
date_published DATE,
page_count NUMBER
);
CREATE TABLE authors (
name VARCHAR2(200) NOT NULL PRIMARY KEY
);
CREATE TABLE books_authors_xref (
author_name VARCHAR2(200),
book_isbn VARCHAR2(13),
CONSTRAINT pk_books_authors_xref PRIMARY KEY (author_name, book_isbn),
CONSTRAINT fk_books_authors_xref1 FOREIGN KEY (author_name) REFERENCES authors (name),
CONSTRAINT fk_books_authors_xref2 FOREIGN KEY (book_isbn) REFERENCES books (isbn)
);
CREATE TABLE book_copies (
barcode_id VARCHAR2(100) NOT NULL PRIMARY KEY,
book_isbn VARCHAR2(13),
CONSTRAINT fk_book_copies FOREIGN KEY (book_isbn) REFERENCES books (isbn)
);
答案 0 :(得分:4)
它被合理地规范化了。我将一个数字“author_id”添加到authors表中,并在books_authors_xref表中使用它而不是author_name,并将其用于关系,这样可以处理两个具有相同名称的作者,并更改存储方式这个名字后来没有搞乱。 : - )
答案 1 :(得分:2)
我认为所有四张牌都在5NF。 你认为什么?
但是。 。
作者姓名不是唯一的。向authors表添加ID号可标识该行,但不识别作者。例如,假设有两位作者的名字为“Richard Knop”。您不能将两者都输入到现有表中,因为对作者名称存在主键约束。如果您尝试通过添加ID号来解决此问题,则最终可能会这样做。
author_id author_name
--
1 Knop, Richard
2 Knop, Richard
你是哪一个?你怎么知道的?
答案 2 :(得分:2)
除了使用Christo和Catcall提到的“author_id”之外,您还可以考虑在书桌上使用“book”id作为主键。并非所有发布/打印的内容都有ISBN--因为这本书早于ISBN,或者是由不认为需要ISBN的人打印的(例如我多年来见过的很多培训材料)。
答案 3 :(得分:0)
我试试这个,它只是起作用......我做了一点改变,并创建了表格。此外, ISBN用作外键。
CREATE TABLE book_copies
( barcode_id VARCHAR2(100) NOT NULL PRIMARY KEY,
ISBN VARCHAR2(13),
CONSTRAINT FK_BOOK_COPIES FOREIGN KEY (ISBN )REFERENCES books (isbn))