1NF
- это аспект таблицы, представляющей отношение , а не таблицы как таковой.
Если ваше отношение говорит ticket HAS price
, что это нарушение 1NF
, поскольку вы не можете определить, ticket
HAS
или HAS NOT
price
, просматривая одну запись. Вам нужно будет получить все цены на этот билет и выбрать последний из них, что нарушает non-ordering rule
из 1NF
.
Если ваше отношение говорит ticket HAD BEGUN TO COST price ON date
, то оно в 1NF
все в порядке, потому что каждая запись говорит то, что говорит: это ticket
стоит это price
с это date
.
Таким образом, мы говорим, что эта таблица не соответствует 1NF
, когда представляет первое отношение, но соответствует, когда представляет второе.
Сам стол, конечно, остается прежним.
Это не обязательно означает, что вам нужно разделить ваши таблицы.
Весь смысл relational databases
в том, что вы можете использовать relational operators
для преобразования одного отношения в другое.
Что такое relation
с точки зрения RDBMS
? Это таблица, показывающая все комбинации всех возможных значений, которые находятся в этом отношении между собой.
Например, если нам нужно построить отношение равенства на натуральных числах от 1
до 5
, у нас есть эта таблица:
1 1
2 2
3 3
4 4
5 5
Все пары, которые появляются в этой таблице, находятся в равенстве; все пары, которые не появляются, нет. Мы не видим здесь (2, 3)
или (4, 5)
, поскольку они не равны.
Но вам не нужно хранить всю пару в базе данных. Вместо этого вы сохраняете отдельные значения и пишете запрос:
SELECT n1.number, n2.number
FROM number n1, number n2
WHERE n1.number = n2.number
, что дает тот же результат.
На самом деле нормальные формы позволяют хранить простейших из возможных таблиц отношений в базе данных и строить из них более сложные отношения, используя SQL
запросов.
В вашем случае, если вы напишите запрос (или определите представление) следующим образом:
SELECT ticket, price
FROM mytable
WHERE (ticket, date) IN (
SELECT ticket, MAX(date)
FROM mytable
GROUP BY
ticket
)
, вы получаете отношение (ticket HAS price
) из (ticket HAD BEGUN TO COST price ON date
) точно так же, как если бы вы хранили всю таблицу в базе данных.