Лучший способ сравнить две таблицы базы данных разных типов и сравнить их данные? - PullRequest
1 голос
/ 02 сентября 2011

У меня есть две таблицы базы данных, одна на MYSQL и одна на MSSQL. Оба имеют схожие данные, и один основан на данных другого. Они находятся в двух разных базах данных, потому что одна - это администрируемая удаленная система, а локальная система - это установка Drupal, которую я использую для более удобного отображения данных через пользовательский модуль.

Например, у меня есть таблица такого рода структуры в MSSQL:

ID | Title | Description | Other fields I don't care about

И на основе извлечения данных из этой таблицы я создаю таблицу на MYSQL:

local_id | remote_id | title | description

Когда модуль инициализируется, он выходит из системы и делает выбор из таблицы MSSQL, генерирует записи и заполняет локальную базу данных. Remote_id - это поле идентификатора в базе данных MSSQL, поэтому мы можем ссылаться на две записи вместе.

Мне нужно синхронизировать эти данные, локально удаляя записи, которых больше нет в удаленной таблице, и создавая новые записи, которые не существуют локально, а также обновляя информацию обо всех строках.

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

Чтобы синхронизировать локальное с удаленным и удалить несуществующие удаленные записи:

Select remote_id from local_table;
  For Each remote_id ( select ID, title, description FROM remote_table where ID = remote_id )
    If record exists
      UPDATE local_table WHERE remote_id = row_id
    Else
      DELETE FROM local_table where remote_id = row_id

Затем нам понадобится как минимум еще одна транзакция для получения новых записей (я мог бы обновить и здесь, если бы не делал это в предыдущем цикле):

Select ID, title, description from remote_table;
  For each ID ( Select remote_id from local_table )
    If does not exist
      INSERT INTO local_table (VALUES)

Так что это большая активность в БД. Было бы проще, если бы таблицы были одного типа, но так как это единственный способ, которым я знаю, как это сделать. Есть ли способ лучше? Могу ли я просто объединить оба набора результатов в ассоциативный массив и сравнить таким образом, и выполнять только транзакции, необходимые для удаления и создания? Я не уверен.

Ответы [ 2 ]

1 голос
/ 19 сентября 2011

Есть много способов сделать это на основе системы, которую вы используете.Первое предположение, которое я делаю, состоит в том, что у вас есть две базы данных, и вы хотите синхронизировать данные между этими двумя, то есть MSSQL db должен извлекать данные из MySQL и наоборот

Ваш подход использования ассоциативных массивов хорош, но что еслив таблице 100 колонок?(в вашем случае это не так, но подход не является перспективным). Чтобы обновить 1 строку, нужно выполнить «n» сравнений столбцов, если имеется 100 строк, тогда будет 100 * n сравнений

взгляните на MySQL REPLACE, INSERT INTO .. ​​ON DUPLICATE KEY, которые могут вам помочь - я не знаю, есть ли такие предложения в MSSQL

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

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

логика будет в этих строках

to sync local to remote 
foreach localrow 
  get the common_id of the row 
  get the timestamp of the row 
  check if a row with this common_id exists in the remote table 
  if no then insert 
  if yes then 
    compare timestamps between local and remote row 
    if local row timestamp > remote row timestamp then update remote row 
0 голосов
/ 02 сентября 2011

Вместо того, чтобы выполнять построчные операции, вы можете выполнять операции на основе набора. например,

INSERT INTO local_table (vales)
SELECT .. FROM  remote_table
WHERE NOT EXISTS (Select ... FROM local_table WHERE remote_table.field = local_table.field and ...)

Для этого вам нужно добавить связанный сервер. См. sp_addlinkedserver . Вы можете создать ссылку с SQL Server на любой сервер, указанный на странице. Это включает в себя любую базу данных, которая имеет драйвер ODBC, который есть в MySQL.

Я не знаю, способен ли MySQL сделать обратное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...