Помогите мне нормализовать мою простую схему каталога книг - PullRequest
1 голос
/ 24 апреля 2011

Это простая модель базы данных для онлайн-каталога библиотеки.Я пытаюсь нормализовать это, если возможно.Как вы думаете, что я должен изменить или сделать по-другому?

Например, я не уверен насчет авторов таблицы.У него есть только один столбец «имя», который также является первичным ключом, и я использую его также как внешний ключ в другой таблице.Это хорошая практика?Кроме того, я должен поставить там два столбца ("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)
);

Ответы [ 4 ]

4 голосов
/ 24 апреля 2011

Это достаточно нормализовано. Я добавил бы числовой «author_id» в таблицу авторов и использовал бы ее вместо author_name в таблице books_authors_xref и использовал бы ее для отношений, что позволяет вам делать такие вещи, как работа с двумя авторами с одинаковыми именами, и менять способ хранения имя позже, не делая беспорядок. : -)

2 голосов
/ 25 апреля 2011

В дополнение к использованию "author_id", как было упомянуто Christo и Catcall, вы можете также рассмотреть возможность использования "book" id "для первичного ключа на вашей книжной таблице. Не все вещи, опубликованные / напечатанные, имеют ISBN - либо потому что книга предшествует ISBN, или она была напечатана кем-то, кто не думал, что ей нужен ISBN (например, много учебных материалов, которые я видел за эти годы).

2 голосов
/ 25 апреля 2011

Я думаю, что все четыре таблицы в 5NF.Что вы думаете?

Но.,.

Имена авторов не являются уникальными.Добавление идентификационного номера в таблицу авторов идентифицирует строку, но не идентифицирует автора.Например, предположим, что есть два автора с именем «Ричард Кноп».Вы не можете ввести оба в свою существующую таблицу, потому что есть ограничение первичного ключа на имена автора.Если вы попытаетесь исправить это, добавив идентификационный номер, вы можете получить следующее:

author_id    author_name
--
1            Knop, Richard
2            Knop, Richard

Кто из них вы?Откуда ты знаешь?

0 голосов
/ 13 апреля 2014

Я пробую это, и это просто работает ... Я делаю небольшие изменения, и таблица создается.Кроме того, 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))
...