2015-07-31 3 views
0

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

(В моей SQL-пропитано мировоззрение, тип по умолчанию идентификатора является INT или долго, хотя я с удовольствием рассмотрит другие возможности.)

Решения Я Рассматриваемые

  1. Назначьте каждому устройству кучу идентификаторов, которые (надеюсь) больше, чем они будут использовать между синхронизациями, и пополняют его при синхронизации.

  2. Присвойте каждой вновь созданной записи временный идентификатор (Guid), пока ему не будет присвоен «реальный» ID Системой записи.

  3. Использование гидов в качестве идентификаторов.

  4. Заблокируйте процесс создания, пока идентификатор не предоставлен Системой записи (не рекомендуется из-за возможного прерывания сети).

  5. Используйте первичное значение (например, имя) в качестве идентификатора (также не являющегося предпочтительным из-за возможного изменения основного значения).

Это то, что я придумал сам по себе, но так как это типу проблемы, которая, конечно, уже был решены в десять миллионов раз, каково принятые решения?

+0

Мне просто интересно - зачем вам идентификатор, прежде чем он будет назначен вам базовым уровнем сохранения? – Gerino

+0

Если мне нужны данные и отношения между записями для сохранения на удаленном устройстве, мне нужны идентификаторы, верно? –

ответ

1

У вас может быть уникальный идентификатор для каждого устройства (может быть установлен при первоначальной он-лайн регистрации), и каждое устройство будет выполнять свою нумерацию. Сами записи будут использовать составной первичный ключ: (originDeviceId, recordId), который затем гарантированно будет уникальным для всех устройств и имеет несколько других преимуществ, например, нет необходимости менять ключ при синхронизации с сервером и возможность использовать этот ключ для сборки отношения с оффлайновым удаленным устройством с самого начала.

Основной недостаток заключается в том, что для записи записи нужны два столбца. A-bit hacky - обходное решение будет состоять в том, чтобы эти столбцы были определены как ints, а другой - вычислялись как большие int, сделанные из предыдущих двух. Недостатком является не оператор левого сдвига в большинстве РСУБД, но его можно решить, умножив его на две. Тогда вы просто сделать отношения с помощью этого вычисляемого поля, так, например:

SELECT file.* FROM t_File as file 
JOIN t_User as user on file.UserId = user.Id 

-- t_File.UserId is big int and t_User.Id is deviceId * POWER(2, 32) + recordId 

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

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

+0

Интересная идея, но я действительно надеюсь получить некоторые «вот что мы сделали» или даже лучше, «стандартные решения», поскольку это похоже на довольно распространенную ситуацию. –

+0

Несомненно;) Я никогда не видел эту проблему самостоятельно, там, к сожалению. Я бы сказал, что использование GUID является наиболее распространенной практикой - они хорошо поддерживаются SQL Server и другими СУБД, и они практически уникальны.В зависимости от вашей структуры данных я бы, вероятно, создал - в дополнение к уникальному идентификатору PK - кластерному индексу на дату создания, хотя, как я не думаю, что физическое упорядочение случайным числом - это все, что полезно;) – Gerino

+0

Это имеет смысл. –

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