Каждый день я сохраняю (с помощью 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: не встраивайте предположения в проект. Если что-то новое, оно должно быть помечено: «ЭЙ! Я здесь новенький!» Когда в данные были внесены изменения: «Хорошо, что-то изменилось. Вот оно». и когда проблема, наконец, была закрыта, «хорошо, это для меня. Я сделал для».
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, это может быть тот, который используется приложением для изменения ошибок. Это изменило бы, например, обновление любого версионного поля на вставку новой версии.
Дело в том, что это очень гибкий дизайн, который вы можете легко показать только те данные, которые вы хотите, как вы хотите, в любое время.
Других решений пока нет …