реорганизация моей базы данных - PullRequest
2 голосов
/ 10 октября 2011

В старом веб-приложении у меня была таблица со следующей структурой:
tools(id, name, abbreviation, width, height, power, type)

Дело в том, что мне нужно добавить поддержку истории в инструменты. Рабочий сценарий заключается в том, что детали каждого инструмента могут быть изменены, и мне нужно отслеживать изменения. Например, если мне нужно просмотреть детали инструмента за определенную дату из прошлого, как я могу это сделать?

Как должна выглядеть база данных?

Ответы [ 3 ]

1 голос
/ 10 октября 2011

Создайте таблицу ToolsVersions со всеми одинаковыми столбцами, только добавьте также временную метку. Каждый раз, когда вы меняете инструменты, сохраняйте старые значения в таблице ToolsVersions с текущей отметкой времени. Затем вы можете довольно легко запросить все версии в определенном диапазоне или найти версию, ближайшую к желаемой дате.

1 голос
/ 10 октября 2011

Я бы оставил ту же таблицу, но добавил бы поле dateEffective, а затем создавал бы новую строку каждый раз, когда инструмент менялся. Затем при запросе таблицы вы можете получить версию инструмента на определенную дату, используя:

SELECT * FROM tools WHERE id=@id AND dateEffective<@thisDate ORDER BY dateEffective DESC LIMIT (0,1)

РЕДАКТИРОВАТЬ Вы можете создать другое поле с именем toolVersionId в качестве первичного ключа.

РЕДАКТИРОВАТЬ 2 В ответ на ваш комментарий, как насчет:

SELECT *
FROM tools t1
WHERE toolVersionId IN (SELECT toolVersionId
                        FROM tools t2
                        WHERE t2.id = t1.id
                        ORDER BY t2.dateEffective DESC
                        LIMIT (0,1)
                       );
1 голос
/ 10 октября 2011

вероятно, есть много способов сделать это. Одним из способов, с помощью которого я имел успех в прошлом, было добавление столбца version_id в таблицу. Таким образом, комбинация id и version_id становится полным ключом для любой конкретной версии инструмента. Обратите внимание, что при таком подходе очень легко получить все версии определенного инструмента, вы просто выбираете на id. Получить текущую версию инструмента также просто, просто id, max(version_id).

Недостатком этого подхода является необходимость написания кода для управления версиями.

...