Я собираюсь реализовать распределенное приложение с несколькими мобильными клиентами и веб-серверным приложением. Таким образом, каждому клиенту, а также серверу разрешено создавать записи в таблице. Поэтому мне нужны уникальные первичные ключи для всех участников И я хочу иметь возможность генерировать ключи в автономном режиме.
Каков наилучший подход для генерации первичных ключей, которые вы используете в распределенных средах?. По аналогичному вопросу см. . Какая лучшая стратегия первичного ключа для интерактивное/автономное многоклиентское мобильное приложение с SQLite и база данных Azure SQL в качестве центрального магазина?
Я знаю, что генерация ключей UUID - хороший подход для этого сценария, но я хочу придерживаться ключа с именем _id и долгого типа, как это было предложено платформой Android.
Я не хочу иметь составной идентификатор с идентификатором устройства (также сервер является устройством) и локальным идентификатором. Такой подход не будет работать в любом случае, поскольку сервер должен иметь возможность создавать записи для определенного клиента. В этом случае мне придется использовать идентификатор устройства также на сервере.
Поэтому моим текущим фаворитом является создание моего ключа с длинным типом данных (я сделал это раньше в другом проекте). Я думаю, что буду использовать подход высокий/низкий (см. Здесь здесь Что такое алгоритм Hi/Lo?) и иметь ключ, который состоит из из:
- идентификатор клиента (например, ~ 28 бит), сгенерированный с сервера
- низкое значение (например, ~ 4 бит), увеличенное на клиенте, никогда не сохранялось
- высокое значение (например, ~ 32 бита), увеличенное на клиенте, сохраняется только на клиенте
Идентификатор клиента должен быть извлечен с сервера при первом запуске мобильного приложения. Поэтому для первого запуска необходимо подключение к сети. Это может быть недостатком этого подхода. При наличии идентификатора клиента на устройстве я могу сгенерировать ключи без сетевого подключения.
Обычно высокий id является уникальным значением по базе данных. Когда пользователь удаляет приложение и устанавливает его снова, я должен рассматривать его как нового клиента и должен предоставить ему новый идентификатор клиента. В противном случае мне пришлось бы сохранить текущий высокий id на сервере, чтобы иметь возможность восстановить его при потере или при переустановке - не стоит усилий.
Каков наилучший подход для получения высокого идентификатора на Android? Ключ автоинкремента не является решением. Мне нужно что-то вроде функции генератора. И он должен выполняться внутри собственной транзакции (а не "пользовательской" транзакции). Кто-нибудь знает об этом подходе на Android и может ли кто-нибудь указать мне в правильном направлении? (Я нашел этот ответ).
Какую ключевую стратегию вы используете для своего многопроцессорного приложения (онлайн и офлайн)?