2012-01-18 6 views
2

Premesis:SQL первичного ключа автоинкремент против временной метки

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

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

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

Затем я добавил еще поле, которое содержит идентификатор пользователя, так что я индекс, образованный: USER_ID и FIELD_ID таким образом изменения ситуации, но все еще могут быть проблемы ...

1) Я не могу иметь FIELD_ID, как AUTO_INCREMENT 2) Проблема, описанная выше, остается, , если пользователь Павел имеет два устройства с одинаковыми да tabase (одновременно синхронизируется), а в устройстве 1 он делает вставку на table_AAA, и он делает другую вставку на table_AAA, но из устройства 2 у меня будет двойной индекс (USER_ID/FIELD_ID)

Итак, я преобразовал FIELD_ID как VARCHAR (17), составленной YYYYMMDDHHMMSSmmm, таким образом, довольно невозможно, что пользователь делает две операции в одной и той же миллисекунды ..

Вопрос:

есть ли лучший способ установить первичный ключ в моей ситуации ???

+0

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

+0

Почему нет сложного первичного ключа для вас? (user_id, device_id, field_id)? Это не только дает уникальность, но также определяет места, где были созданы данные. Независимо от того, что вы делаете, не стесняйтесь использовать временную метку по любой причине ***, кроме *** как уникальный идентификатор. Вы * в конечном итоге столкнетесь. – MatBailie

+0

как я могу получить идентификатор поля? – Marcx

ответ

2

Создайте второе, уникальное поле, направляющее. Вы получаете свою быструю индексацию для регулярного использования и uniqness для слияния.

+0

Технически вы можете создать два GUID, которые соответствуют. Я не знаю, сколько всего времени жизни вселенной будет выполнено;) Временные метки нельзя считать уникальными, но GUID * действительно * можно считать уникальными. – MatBailie

1

В качестве первичного ключа, вероятно, должен быть UUID, чтобы добавить больше ясности, вы можете добавить поле device_id для выделения строк, хотя UUID должно быть достаточно.

Кстати, UUID С результатами восхождения, то есть фрагментация данных таблицы не должна вас сильно беспокоить.

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