Как сделать историю данных SQL? (сообщить об изменениях данных)

Каждый день я сохраняю (с помощью crontab, php script) информацию об ошибках в базе данных. Каждый ряд похож на:
(Идентификация, дата, название, кто и т. Д ….)

(например:
Идентификация, дата, звание, кто и т. Д.

выпуск1, 2015-04-01, блабла, билл и т.д …

выпуск 2, 2015-04-01, nnnnnnn, john и т.д …

выпуск 3, 2015-04-01, vvvvvvv, greg и т.д …

выпуск1, 2015-04-02, блабла, билл и т.д …

выпуск 2, 2015-04-02, ннннннн, джон и тд …

выпуск 3, 2015-04-02, vvvvvvv, марио и т.д … (вот теперь это марио)

выпуск 2, 2015-04-03, nnnnnnn, джон и т. д … (выпуск 1 исчез)

выпуск 3, 2015-04-03, vvvvvvv, tod и т. д. (tod — новая информация)

выпуск 4, 2015-04-03, рррррррр, джон и т.д … (выпуск 4 новый)

………………………………………
)

В принципе, если я возьму пример, который я опубликовал выше, результаты должны быть примерно такими же, как для сравнения дат 2 апреля и 3 апреля.

Новая строка: проблема4

Закрытая строка: Issue1

Обновленная строка: Issue3 (с tod вместо mario)

Без изменений строка: Issue2

В моем случае это сотни строк, и я думаю, что я знаю, как это сделать благодаря php, но мой код будет длинным, как создание циклов foreach, и будет видеть одну за другой, если будут какие-либо изменения. Я не уверен, что получаю простое решение.

Итак, мой вопрос: есть ли какой-нибудь простой способ сообщить об этих изменениях с помощью «простого» кода (например, специальный запрос sql или любой другой код проекта или простые функции php?).

1

Решение

Есть слишком много предположений, встроенных в этот дизайн. И эти предположения требуют, чтобы вы сравнивали строки между разными днями, чтобы сделать предположение в первую очередь — не говоря уже о том, что вы должны дублировать неизмененные строки из одного дня в другой, чтобы сохранить непрерывную ежедневную запись, необходимую для подачи предположений. Уф.

Правило 1: не встраивайте предположения в проект. Если что-то новое, оно должно быть помечено: «ЭЙ! Я здесь новенький!» Когда в данные были внесены изменения: «Хорошо, что-то изменилось. Вот оно». и когда проблема, наконец, была закрыта, «хорошо, это для меня. Я сделал для».

create table Bug_Static( -- Contains one entry for each bug
ID     int identity,
Opened date not null default sysdate,
Closed date [null | not null default date '9999-12-31'],
Title  varchar(...),
Who    id references Who_Table,
<other non-changing data>,
constraint PK_Bug_Static primary key( ID )
);
create table Bug_Versions( -- Contains changing data, like status
ID        int not null,
Effective date not null,
Status    varchar not null,  -- new,assigned,in work,closed,whatever
<other data that may change from day to day>,
constraint PK_Bug_Versions primary key( ID, Effective ),
constraint FK_Bug_Versions_Static foreign key( ID )
references Bug_Static( ID )
);

Теперь вы можете выбрать ошибки и текущие данные (последние внесенные изменения) в любой день.

select  s.ID, s.Opened, s.Title, v.Effective, v.Status
from    Bug_Static   s
join    Bug_Versions v
on  v.ID = s.ID
and v.Effective =(
select  Max( Effective )
from    Bug_Versions
where   ID = v.ID
and Effective <= sysdate )
where   s.Closed < sysdate;

where s.Closed < sysdate не является обязательным. Это дает вам все ошибки, которые были закрыты в день выполнения запроса, но не те, которые были закрыты до этого. Это предотвращает повторное появление закрытых ошибок — если только это не то, что вы хотите.

Изменить sysdate значения для конкретной даты / времени, и вы получите данные, как они появились на эту дату и время.

Обычно при создании ошибки строка вводится в обе таблицы. Тогда только новые версии вводятся как статус или любые другие изменения данных. Если за день ничего не изменилось, ничего не вводится. Затем, когда ошибка, наконец, закрыта, Closed поле статической таблицы обновляется и closed версия вставляется в таблицу версий. Я показал Closed поле с двумя опциями, нулевым или с определенной «максимальной датой» от 31 декабря 999 г. Вы можете использовать любой из них, но мне нравится метод максимальной даты. Это упрощает запросы.

Я также поставил бы перед обоими столами пару представлений, которые присоединяются к столам. Один, который показывает только последние версии каждой ошибки (Bug_Current) и один, который показывает каждую версию каждой ошибки (Bug_History). С триггерами на Bug_Current, это может быть тот, который используется приложением для изменения ошибок. Это изменило бы, например, обновление любого версионного поля на вставку новой версии.

Дело в том, что это очень гибкий дизайн, который вы можете легко показать только те данные, которые вы хотите, как вы хотите, в любое время.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]