Intereting Posts
IllegalArgumentException при добавлении облачных сообщений api в GoogleApiClient Плавающая кнопка действия не поднимается, когда в Snack bar отображается в android Как предотвратить открытие ссылок в интегрированном мини-браузере Gmail Phonegap – кордова – медленная и медленная работа на устройствах Android и iOS Уведомления Android Push в Китае Как использовать базу данных firebase извещателя трансляции Как использовать словарь (например, iphone NSDictionary) в android? Как получить имя файла и реальный путь к файлу диска Google? Проблема сборки при использовании <cmath> с android ndk Странное поведение updateViewLayout Разница между JSONObject и JSONArray Android: объединение или объединение двух аудиофайлов зависает приложение Селектор значков не работает с PagerSlidingTabStrips Компиляция ffmpeg с помощью android ndk r5b Мне нужно показать PDF, в котором текст pdf будет автоматически соответствовать ширине экрана, а оставшийся текст переместится на следующую строку

Какова наилучшая первичная ключевая стратегия для онлайн-офлайнового многопользовательского мобильного приложения с базами данных SQLite и Azure SQL в качестве центрального магазина?

Какую стратегию первичного ключа лучше всего использовать для модели реляционной базы данных, учитывая следующее?

  • Десятки тысяч пользователей
  • Несколько клиентов на одного пользователя (телефон, планшет, рабочий стол)
  • Миллионы строк в таблице (постоянно растущие)

Azure SQL будет центральным хранилищем данных, которое будет отображаться через Web API. Клиенты будут включать в себя веб-приложение и ряд собственных приложений, включая iOS, Android, Mac, Windows 8 и т. Д. Веб-приложение потребует «всегда включенное» соединение и не будет иметь локальное хранилище данных, но вместо этого будет получать и обновлять Через api – думаю CRUD через RESTful API.

Все остальные клиенты (телефон, планшет, рабочий стол) будут иметь локальный db (SQLite). При первом использовании этого типа клиента пользователь должен аутентифицироваться и синхронизироваться. После аутентификации и синхронизации эти клиенты могут работать в автономном режиме (создание, удаление и обновление записей в локальном SQLite db). Эти изменения в конечном итоге будут синхронизироваться с бэкэндом Azure.

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

Вот что мы рассмотрели до сих пор:

GUID

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

тождественность

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

композитный

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

HiLo (объединенный композит)

Подобно комбинированному подходу каждому клиенту присваивается идентификатор клиента (int32) при первой синхронизации. Идентификатор клиента объединяется с уникальным локальным идентификатором (int32) в один столбец, чтобы сделать уникальный уникальный идентификатор приложения (int64). Это не должно приводить к конфликтам во время синхронизации. Хотя для этих ключей и GUID больше ограничений, так как идентификаторы, созданные каждым клиентом, являются последовательными, будут тысячи уникальных идентификаторов клиентов, так что мы все еще подвергаем риску фрагментации нашего кластерного индекса?

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

Solutions Collecting From Web of "Какова наилучшая первичная ключевая стратегия для онлайн-офлайнового многопользовательского мобильного приложения с базами данных SQLite и Azure SQL в качестве центрального магазина?"

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