Лучшие практики для моментального снимка строк базы данных SQL - PullRequest
0 голосов
/ 15 июля 2010

У меня есть две таблицы X и Y. Это серверная часть веб-приложения CRUD.

Допустим, строки в Y имеют поля a, b и c. Когда создается строка в X, она должна ссылаться на снимок значений в определенной строке Y. Строка в Y может измениться позже, но строка в X должна все еще иметь значения a, b и c на момент создания.

Каков «правильный» способ сделать что-то подобное? Дублирование полей a, b и c в X кажется простым, но мне было интересно, есть ли более эффективные способы сделать это.

Ответы [ 2 ]

3 голосов
/ 15 июля 2010

Вам необходимо реализовать «Медленно меняющееся измерение».

В основном, в дополнение к «естественному» ключу, у вас также есть метки времени valid_from и valid_to.

Текущая строка всегда имеет значение «valid_to», равное «9999-12-31 23:59:59» или самое высокое значение даты / времени, которое вы можете обработать системой.

Первый ряд будет иметь: -

id       valid_to    valid_from     description.
 1      2009-12-25   9999-12-31     My best new toy.

При изменении описания вы не перезаписываете текущую строку но добавьте полную новую строку и измените дату valid_to в старой строке следующим образом: -

id       valid_to    valid_from     description.
 1      2009-12-25   2009-06-22     My best new toy
 1      2010-06-23   9999-12-31     A broken toy.

Затем вы можете использовать дату создания вашей строки Y для соответствующей строки X по этой дате.

Select * from x 
         join Y on x.id = y.id 
                and x.create-date >= valid_from
                and x.create-date <= valid_to

Я рекомендую вам использовать временные метки, а не даты, но принцип легче проиллюстрировать с помощью дат.

2 голосов
/ 15 июля 2010

«Дублирование» столбцов мне кажется правильным шагом. Некоторые люди могут ошибочно думать, что вы нарушаете правильный дизайн базы данных, дублируя данные, но на самом деле каждая таблица (и ее столбцы) содержат разные данные. Одна - это «текущие» значения, а другая таблица имеет эти значения в определенный момент времени.

Аналогия будет с адресами в счете. Если вам необходимо зафиксировать адрес клиента во время выставления счета, вы не дублируете данные, помещая в столбцы адреса счет-фактуру, а также располагаете адрес у клиента, поскольку они содержат потенциально разные версии адреса. 1003 *

...