LINUX.ORG.RU

Синхронизация базы данных

 ,


0

1

Есть приложение на ведроиде (sqlite) и база (мускул) на сервере. Приложение должно синхронизироваться с сервером и забирать с него новые/измененные записи в базе.

На StackOverflow народ советовал в таком случае ввести в базу поле «version» и тупо скачивать строки с version выше, чем на девайсе. Но суть слегка не в этом.

На сервере софт, отвечающий за базу, висит на питоне. Чтоб не плодить сущности - server-side для синхронизации будет на нем же.

Вопрос в следующем: что лучше (не правильнее, а быстрее/проще/ниже нагрузка на девайс) - socket, после чего разгребать данные уже на девайсе, или генерить текстовый ответ (подключение как к обычной странице + параметр в GET), сразу содержащий все нужные команды построчно? В базе в каждой записи есть блоб около 5-6 кило весом.

★★★★★

  • Строки только добавляются или изменяются/удаляются тоже?
  • Может в строке измениться одно поле, а остальные и блоб остаться прежними?
  • Требуется именно иметь полную копию на устройстве или можно обойтись?
  • Какая связь на девайсе в худшем случае (GPRS/EDGE/3G/WiFi...)?

А вообще, по моему, лучше в двоичном виде. Транзакциями по строке. Тогда при обрыве восстанавливаться будет проще (типа «дай изменения с момента x»).

vahtu
()

ну как бы генерация комманд на сервере позволяет не только добавлять новые записи в базу но и... делать с базой что угодно. Как бы менее секурно (вдруг дурной сотрудник вашей конторы выпустит «апдейт» который потрёт базу у всех 100тыщ пользователей приложения), но может быть более удобным. Так что я за raw sql. Заодно не придётся писать парсер на клиенте.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

вдруг дурной сотрудник вашей конторы выпустит «апдейт» который потрёт базу у всех 100тыщ пользователей приложения

в случае кривой эканизации параметров [при генерации SQL-кода] — такой «апдейт» можно ожидать от совершенно разных людей, кстате :-)

в случае парсинга — сложнее допустить ошибку в экранизации, так как всё-таки добавление на клиенте будет происходить через «Python Database API Specification»

user_id_68054 ★★★★★
()
Ответ на: комментарий от vahtu

Строки могут изменяться, блоб заливается 1 раз. Копия на устройстве полная (около 15 метров). Связь - жопорез.

Апдейт около 30-40 кб (если регулярно, т.е. раз в 1-2 дня в фоновом режиме) если в виде текста sql-команд.

upcFrost ★★★★★
() автор топика
Последнее исправление: upcFrost (всего исправлений: 1)
Ответ на: комментарий от user_id_68054

так как всё-таки добавление на клиенте будет происходить через «Python Database API Specification»

На клиенте ведроид, т.е. далвико-жаба.

upcFrost ★★★★★
() автор топика
Ответ на: комментарий от true_admin

raw sql

В плане sql через socket-соединение? Тоже неплохой вариант кстати.

вдруг дурной сотрудник вашей конторы

Их всего двое включая меня. И второй - дизайнер, он код не трогает. Хотя к себе слово «дурной» тоже могу применить довольно часто.

upcFrost ★★★★★
() автор топика
Ответ на: комментарий от user_id_68054

в случае кривой эканизации параметров

Поэтому я хотел предложить mysqldump с --where='where_condition' :). В таком случае всё становится тривиально. Почему вчера не написал? А вчера голова уже ночью не работала.

true_admin ★★★★★
()
Ответ на: комментарий от upcFrost

В плане sql через socket-соединение?

можно и так, кстати. Но я думал больше о скачивании, скажем, по http дампа и последующим sqlite.execute(SQL_DUMP). Это мне кажется лучше т.к. позволяет работать через прокси.

А вообще задачка синхронизации баз интересная. Особенно если базы разные. Мне нравится идея с версионностью озвученная сдесь. Можно при помощи каких-нибудь триггеров сильно автоматизировать. Собстно, так slony (система репликации для postgres) и работает.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Мне нравится идея с версионностью озвученная сдесь

Ну а как иначе? Каждый раз в фоне заставлять юзера качать 10-15 метров базы по жопорезу глупо. А SQLite (да и сам ведроид) как я понял не имеют встроенных возможностей синхронизации. Надо обозначать какую выборку послать, и тогда только какие-то версии, timestamp и т.п.

Вот кстати про sqlite.execute(DUMP) не подумал, крайне здравая идея (если конечно sqlite позволит это выполнить)

upd.: не позволит, по крайней мере прямо. Только через сторонние костыли на сервере. У мускула и скулайта разные форматы

upcFrost ★★★★★
() автор топика
Последнее исправление: upcFrost (всего исправлений: 1)
Ответ на: комментарий от true_admin

кстати парсер писать все равно придется. Файл так передать действительно удобнее, да и сжать можно к тому же. Но объединить апдейт с основной базой нужно будет руками (типа if exists {update} else {add}), в ведре такие функции отсутствуют. к сожалению в базе не только добавления, но и изменения будут

upcFrost ★★★★★
() автор топика
Ответ на: комментарий от upcFrost

У мускула и скулайта разные форматы

эм, mysqldump умеет дампить в разных форматах. А что именно не получилось? Синтаксис инсертов и апдейтов, вроде, такой же.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Может что-то делал не так, но были проблемы с блобом. Вышло намного легче поставить SQLite3 и чуть поменять скрипт наполнения базы. Так оно сразу фасует в файл, который передается на устройство.

SyncAdapter по моей памяти нечто монструозное и делающее все кроме того, что нужно делать

upcFrost ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.