Классика баз данных - статьи

       

реляционная теория наводит на мысль


бессмысленными, когда речь идет о таблицах со

строками-дубликатами. Самое интересное состоит в том, что если

реляционная теория наводит на мысль о том, как правильно,

корректно и полезно использовать базы данных, то язык SQL, якобы

давая пользователям большую свободу, ничего не предлагает

относительно способов полезного использования этой свободы.

Первичные ключи и неопределенные значения

Как мы обещали выше, рассмотрим реальные причины того, что в двух

таблицах базы данных pubs отсутствует первичный ключ. Для

определенности выберем одну из этих таблиц - discounts (скидки).

Схема таблицы выглядит следующим образом:

CREATE TABLE discounts

(discounttype varchar(40) NO NULL, stor_id char(4),

lowqty smallint, highqty smallint, discount float NO NULL,

FOREIGN KEY stor_id REFERENCES stores)

Как видно, строка таблицы описывает скидку, назначенную для

указанного магазина. Однако в то же время строки таблицы могут

описывать и потенциально возможные скидки, даже если они не

назначены никакому магазину (поэтому столбцы stor_id, lowqty и

highqty могут содержать неопределенные значения). С другой

стороны, тип и размер скидки могут быть одни и те же для разных

магазинов. Тем самым, пара столбцов (discounttype и discount),

которые могли бы служить первичным ключом, на самом деле таковыми

не являются (остальные столбцы не могут входить в первичный ключ,

потому что потенциально содержать неопределенные значения). Тем

самым, мы имеем таблицу, принципиально не содержащую первичного

ключа и потому (опять же потенциально) включающую

строки-дубликаты (смысла в них нет, но ничто не запрещает их

появление).

Как мы уже говорили, компания Microsoft могла бы сделать схему

базы данных pubs более соответствующей рецептам реляционной

теории. Например, можно было бы вместо таблицы discount сделать

две таблицы:

CREATE TABLE discounts

(discount_id int NO NULL, discounttype varchar(40) NO NULL,

discount float NO NULL,

PRIMARY KEY (discount_id))

CREATE TABLE discountsstores


Содержание  Назад  Вперед