База данных - управление версиями данных (продолжение)

$args = array(
    'post_type' => 'product',
    'orderby' => 'ASC',
    'posts_per_page'=>-1
);
$wp_query = new WP_Query($args);
5
задан Community 23 May 2017 в 12:03
поделиться

2 ответа

Вам, вероятно, следует попробовать прочитать об обработке 'Temporal Database'. Вы можете посмотреть две книги: Дарвен, Дэйт и Лоренцос « Временные данные и реляционная модель » и (в совершенно другой крайности) « Разработка приложений для баз данных, ориентированных на время на SQL » , Ричард Т. Снодграсс, Morgan Kaufmann Publishers, Inc., Сан-Франциско, июль 1999 г., 504 + xxiii страниц, ISBN 1-55860-436-7. Это распечатано, но доступно в формате PDF на его веб-сайте cs.arizona.edu . Вы также можете искать интервалы в « Allen's Relations » - они могут быть вам полезны.


Я предполагаю, что тип DATE в вашей базе данных включает время (так что вы, вероятно, используете Oracle). Стандартным типом SQL, вероятно, будет TIMESTAMP с некоторым количеством дробных цифр для субсекундного разрешения. Если ваша СУБД не включает время с DATE, то вы столкнетесь с трудной проблемой, решив, как обрабатывать несколько изменений за один день.

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

Start time        -- When this set of values became valid
End time          -- When this set of values became invalid
PersonID          -- Person.ID (or PersonAudit.ID) for Person data
NameID            -- Name.ID (or NameAudit.ID) for Name data
DOB               -- Date of Birth recorded while data was valid
Email             -- Email address recorded while data was valid
FirstName         -- FirstName recorded while data was valid
LastName          -- LastName recorded while data was valid
NickName          -- NickName recorded while data was valid

Я предполагаю, что после того, как Person.ID установлен, он не изменится; то же самое для Name.ID. Это означает, что они остаются в силе, пока действуют записи.

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


Там гораздо больше. можно было сказать. Однако, прежде чем идти дальше, я хотел бы получить некоторые отзывы о некоторых из поднятых на данный момент проблем.


Некоторые другие вопросы SO, которые могут помочь:


Поскольку это был написан ответ, есть еще одна книга, опубликованная о другом наборе методов, называемых «Asserted Versioning», для обработки временных данных. Это книга « Управление временем в реляционных базах данных: как проектировать, обновлять и запрашивать временные данные » Тома Джонстона и Рэндалла Вайса. Вы можете найти их компанию на AssertedVersioning.com . Осторожно: вокруг механизма могут быть проблемы с патентами.

Кроме того, был опубликован стандарт SQL 2011 (ISO / IEC 9075: 2011, в нескольких частях). Он включает некоторую поддержку временных данных.

6
ответ дан 14 December 2019 в 13:45
поделиться

Сохраните одну таблицу изменений с идентификатором автоинкремента и сделайте все свои изменения, чтобы ссылаться на эту таблицу.

Всегда помещайте исходную запись в таблицу аудита.

Чтобы создать историю, выберите все свои изменения и покажите значение, наиболее близкое к изменению.

Вот так:

`Change`

1
2
3
4
5
6

`NameAudit`

1 - created as John Smith
5 - changed to James Smith

`PersonAudit`

1 - created as born on `01.01.1980` in `Seattle, WA`
2 - changed DOB to '01.01.1980`
3 - changed DOB to '02.01.1980`
4 - changed DOB to '02.01.1980`
6 - changes POB to `Washington, DC`

Затем выберите:

SELECT  c.id,
        (
        SELECT   MAX(id)
        FROM     NameAudit na
        WHER     na.id <= c.id
        ) as nameVersion,
        (
        SELECT   MAX(id)
        FROM     PersonAudit pa
        WHER     pa.id <= c.id
        ) as personVersion,
        na.*,
        pa.*
FROM    change c
JOIN    NameAudit na
ON      na.id = nameVersion
JOIN    PersonAudit pa
ON      pa.id = nameVersion
WHERE   change_id BETWEEN 1 AND 6
0
ответ дан 14 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: