Помогите мне нормализовать мою простую схему каталога книг

#sql #oracle #database-design #plsql #normalization

#sql #Oracle #база данных-дизайн #plsql #нормализация

Вопрос:

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

Например, я не уверен в авторах таблицы. В ней есть только один столбец «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)
);
  

Комментарии:

1. просто предложение — вам не нужно ограничение NOT NULL для столбца, объявленного как ПЕРВИЧНЫЙ КЛЮЧ.

Ответ №1:

Она достаточно нормализована. Я бы добавил числовой «author_id» в таблицу authors и использовал бы его вместо author_name в таблице books_authors_xref и использовал это для отношений, что позволяет вам выполнять такие действия, как работа с двумя авторами с одинаковым именем, и изменять способ сохранения имени позже, не создавая беспорядка. 🙂

Ответ №2:

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

Но . . .

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

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

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

Комментарии:

1. Но как решить эту проблему? На самом деле бывают случаи, когда два автора литературы из разных стран носят одно и то же имя! Это редко, но случается. Может быть, мне стоит еще добавить туда дату рождения?

2. Вы должны добавить все, что вы используете, чтобы отличить себя от этого другого парня.

Ответ №3:

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

Комментарии:

1. В одной из моих местных библиотек вы можете ознакомиться с игрушками, картами, DVD, компакт-дисками, записанными книгами, плакатами, нотами, журналами, газетами, картинами и — подождите этого — репетиторами! О, и вы тоже можете посмотреть книги.

Ответ №4:

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