#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))