«Различающиеся» объекты из реляционной базы данных - PullRequest
9 голосов
/ 11 мая 2009

Наше приложение win32 собирает объекты из данных в нескольких таблицах в реляционной базе данных MySQL. Для такого объекта несколько ревизий хранятся в базе данных.

При хранении нескольких ревизий чего-либо, рано или поздно вы зададите себе вопрос, сможете ли вы визуализировать различия между двумя ревизиями :) Итак, мой вопрос: что было бы хорошим способом для "сравнения" двух такие объекты базы данных?

  • Сделали бы вы сравнение на уровне базы данных? (Звучит не очень хорошая идея: слишком низкий уровень и слишком чувствительный к схеме).
  • Не могли бы вы сравнить объекты?
    • Не могли бы вы написать функцию, которая "вручную" сравнивает свойства и поля двух объектов?
    • Как бы вы сохранили различия? В отдельном родовом объекте "TDiff"?
    • Какие-либо общие рекомендации о том, как визуализировать такие вещи в пользовательском интерфейсе?

Советы или истории о вашем собственном опыте с этим, очень приветствуются; спасибо большое!

Дополнительная информация о прецеденте (20090515)

В ответ на комментарий Антония: это специальное приложение используется для составления расписания учебных курсов, проводимых командами учителей. Расписание учителя хранится в различных таблицах базы данных и содержит такую ​​информацию, как «куда она должна идти в какой день», «кто ее коллеги по команде» и т. Д. Эта информация разбросана по нескольким таблицы.

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

Надеюсь, что это делает сценарий более осязаемым:)

Несколько заключительных замечаний

Ну, щедрость подошла к концу, поэтому я принял ответ. Если бы можно было как-то вырезать пару лишних сотен из моего представителя и дать его другим ответам, я бы сделал это без колебаний. Вся помощь твоих парней была отличной, и я очень благодарен! ~ Onno 20090519

Ответы [ 12 ]

1 голос
/ 13 мая 2009

Я смотрел MysQL Diffing несколько раз. К сожалению, хороших решений не существует.

Одним из инструментов, которые я пробовал, был mysqldiff (www.mysqldiff.org). mysqldiff - это инструмент, написанный на PHP, который способен анализировать схемы mysql. К сожалению, большую часть времени это не помогает.

MySQL Workbench, собственная SQL IDE в MySQL предоставляет возможность создания сценария изменения, и я думаю, что он делает это, выполняя некую внутреннюю операцию diff.

Aqua Data Studio - еще один инструмент, способный сравнивать схемы и выводить их разность. Хотя ADS diff довольно хорош, он не предоставляет инструмента для создания сценария изменения.

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

Хранение, я не уверен. Я хотел бы посмотреть, как система контроля версий, такая как Mercurial, хранит свою разностную информацию для ревизий, и использовать ее для разработки метода, подходящего для БД.

Наконец, для визуального вывода я рекомендую вам взглянуть на функцию сравнения Aqua Data Stduio (вы можете использовать пробную версию, чтобы проверить это ...). У него довольно хороший вывод различий.

0 голосов
/ 14 мая 2009

Пример с Oracle.

  • Экспорт упорядоченных объектов в текст с помощью dbms_metadata
  • Экспорт данных упорядоченных таблиц в CSV или формат запроса
  • Создать большой текстовый файл
  • Diff
...