Мастер БД MySQL, питающий БД SQLite (Android) - PullRequest
1 голос
/ 16 февраля 2011

У нас есть база данных на нашем главном сервере (PHP / MySQL), в которой хранятся наши данные, которые обновляются через веб-сайт.Я пытаюсь найти лучший способ скопировать эти данные в локальную базу данных SQLite (работает на Android).Из-за ограничений скорости мобильного интернета и т. Д. Мне нужно будет встроить проверки, чтобы увидеть, нужно ли обновлять каждую строку.Мысль, что номер версии для каждой строки может быть лучшим решением.

Что думают люди по этому поводу?

Спасибо, Натан

Ответы [ 2 ]

1 голос
/ 16 февраля 2011

В зависимости от размера базы данных, двоичный поиск может стоить того.

По сути, создайте запрос, который запускает MD5() для подмножества строк.Тогда это так же просто, как пройтись по дереву в двоичном виде, пропуская те разделы, которые соответствуют.Шаги:

  1. Предварительно рассчитать первые 3 уровня поиска (или около того), отправить его клиенту.

  2. На клиенте,вычислить эти 3 уровня, проверить на совпадения.На тех, которые не совпадают, вычислите 3 уровня (14 хешей на несоответствующий уровень 3) и отправьте обратно на сервер.

  3. На сервере вычислите следующие 3 уровня и сравните с тем, чтобыл отправлен клиентом.Вычислите следующие 3 уровня для несовпадающих строк.

  4. Повторяйте 2-3, пока число строк не достигнет 1 в каждом пределе.Оказавшись там, вы определили различия, поэтому отправьте / запросите их с сервера, и все готово.

Теперь, почему это более эффективно, чем отправка дампа?Что ж, для 1 измененной строки это займет примерно log(total_rows, 2) * (sizeofMD5 + 2) переданных байтов (без учета служебных данных).Таким образом, для таблицы с 1 миллионом строк потребуется около 352 байтов данных в одном направлении для определения измененной строки.Теперь, чем больше строк будет изменено, тем больше данных он будет использовать.

Я выбрал пакеты по 3, поскольку это хороший компромисс между обработкой дополнительных данных и уменьшением задержки с количеством соединений.

Теперь, что касается хэширования строк, вы можете сделать что-токак:

SELECT MD5(GROUP_CONCAT(row)) AS checksum FROM 
    (
       SELECT 1 AS grouping, MD5(CONCAT(id, col2, col3)) AS row 
       FROM table 
       ORDER BY id ASC
       WHERE id > ? AND id < ?
    ) AS a
    GROUP BY grouping

, который будет производить один MD5, который зависит от каждой строки в пределе.(есть и другие способы, но это иллюстрация).Затем просто вызовите это с помощью 0, count(rows), чтобы проверить всю таблицу целиком, а затем выполните итерацию вниз по цепочке.

Обратите внимание, что это будет работать только для таблиц с целым числом PK (поскольку оно используется в качестве ограничивающегоокно бинарного поиска).Но он будет обнаруживать все типы изменений (master-delete, slave-delete, master-change, slave-change, master-insert, slave-insert) с той же скоростью, эффективностью и кодом.

1 голос
/ 16 февраля 2011

Не будет ли проще использовать временную метку?Просто получите все строки, которые были обновлены с определенного времени.Сколько данных вам нужно скопировать?

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