2013-02-11 2 views
1

Мой вопрос:Mysql синхронизации реляционных баз данных

Как я могу синхронизировать 2 базы данных MySQL (отсутствует локальная база данных с главной онлайновой базы данных)?

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

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

пример таблиц.

db.Cental.users

|id|user|clinic | 
|01|demo|day care| 
|02|nurs|er  | 
|03|demX|day care| 

db.day care.users

|id|user|clinic | 
|01|demo|day care| 
|02|demX|day care| 

(примечание ID обязательно не соответствуют между центральным и местным дб, но структура БД на обоих идентичен)

пример: my main database is more complex than this one, but that should do as an example

информация о базе данных:

  1. У каждого пользователя много посещений, плагинов.

  2. каждый визит содержат 1user как patient_id и 1user, как doctor_id

  3. каждый плагин имеет один пользователь, много входов

  4. plugin_inputs иметь один плагин

У меня 2 баз данных 1 на сервере и других размещенных локально - для автономного режима -

Я хочу, чтобы я мог синхронизировать локально db с онлайн-интерфейсом, но поскольку у меня есть более 1 пользователь, более одного локального db, поэтому каждый из них будет иметь одинаковые идентификаторы, тогда как онлайн-db должен содержать все из них вместе.

так как я могу их синхронизировать?

пользователя я PHP/MySQL (онлайн)/SQLite (местные)

+0

Это не вопрос PHP, это вопрос MySQL. Плохая идея - сохранить 2 таблицы/базы данных, а затем объединить их позже и сделать еще больше хлопот. Возможно, вы должны использовать единую базу данных, а затем изменить настройки своего приложения, чтобы использовать один сервер базы данных. – Husman

+0

@Husman php: incase Мне нужно использовать какой-то код для их синхронизации. Причина, по которой я ДОЛЖЕН пользовательских баз данных 2, заключается в том, что локальная база данных работает в автономном режиме, и пользователь синхронизирует ее, когда когда-либо интернет возвращается. как резервное копирование, и поэтому он может получить к нему доступ из любого места. – Zalaboza

+0

Вам нужно перебрать все записи на локальном компьютере, затем для каждого (я бы рекомендовал экспортировать это как файл CSV или XML/json), вам нужно проверить, что он не существует в онлайн-базе данных, и затем вставьте его в новую запись. Это лучше всего делать, когда онлайн-база данных не используется много (то есть поздно ночью). Причиной для его экспорта в качестве файла xml/json/csv является возможность пакетной обработки, а кодирование упрощается с помощью структурированного формата данных. Надеюсь, это поможет. – Husman

ответ

1

Есть несколько вещей, которые вы можете сделать.

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

В таблице «визит» необходимо включить patient_clinic и doctor_clinic в внешние ключи.

В качестве альтернативы - и намного более грязно - вы можете просто установить поля автоматического приращения для каждой клиники для начала с разных номеров: ALTER TABLE user AUTO_INCREMENT = 10000; установит первый автоматический_инкремент для таблицы пользователя до 10000; если следующая клиника установит его на уровне 20000 (или что-то еще), вы можете избежать совпадений (пока вы не превысите это магическое число, поэтому он грязный).

1

У меня возникнет соблазн перепроектировать архитектуру приложения, чтобы иметь API на «удаленном» конце и работу, которая выполняется в конце каждого дня на «локальном» конце, чтобы публиковать все «локальные» данные для «удаленный» API.

Таким образом, вы могли бы иметь «локальную» работу создать сообщение JSON, похожее на это:

{ user_visit: 
    { 
     user_id: 1, 
     doctor_id: 1, 
     plugins: [ 
      { 
      plugin_name: name, 
      data: { 
       data_field1: "VALUE", 
       data_field2: "VALUE2", 
       data_fieldxx: "VALUExx" 
      } 

     ] 
    } 
} 

И послать каждое сообщение в API. В API вы затем перебираете сообщение JSON, восстанавливая отношения и вставляя их в «удаленную» базу данных соответственно.

Смежные вопросы