Первая нормальная форма и временные данные - PullRequest
2 голосов
/ 16 февраля 2009

Первая нормальная форма говорит, что порядок строк не должен иметь значения. Означает ли это, что таблица с датой как частью ключа не 1NF? например Рассмотрим таблицу цен тикеров, где дата / время являются частью PK. В этом случае вы получите последнюю цену, упорядочив данные по дате и выбрав 1 верхнюю строку. Значит ли это, что для выполнения 1NF нужно разбить таблицу на: 1) TickerCurrentPrice (1 строка на тикер) 2) TickerHistoricalPrice Спасибо

Ответы [ 4 ]

5 голосов
/ 16 февраля 2009

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) точно так же, как если бы вы хранили всю таблицу в базе данных.

2 голосов
/ 16 февраля 2009

Под этим подразумевается, что если необходимо упорядочить данные (например, по дате), то они должны быть записаны явно , например в столбце даты. Что было бы неправильно, так это то, что порядок неявных в физическом порядке строк на диске был бы только *1003* (при условии, что вы все равно можете это контролировать). Другими словами, вам нужно ЗАКАЗАТЬ ПО некоторому столбцу, чтобы получить данные в таком порядке.

2 голосов
/ 16 февраля 2009

Нет, "выберите ... упорядочить по ..." не нарушает 1NF. Порядок строк (и столбцов), который нарушает 1NF, больше относится к ситуациям вдоль строк «select * from XYZ; затем выберите третий ряд сверху и четвертый столбец слева». Да, я видел такие конструкции БД.

0 голосов
/ 16 февраля 2009

Нет. Это означает, что нет внутреннего порядка. Если вы хотите, чтобы дата последней цены была на вашем столе select max(date)

...