Как создать уникальный идентификатор строки в защищенных базах данных? - PullRequest
5 голосов
/ 25 апреля 2009

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

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

Хотелось бы услышать чей-либо опыт решения этой проблемы.

Ответы [ 4 ]

9 голосов
/ 25 апреля 2009

Несколько подходов

1) Дайте каждому осколку свой идентификатор и используйте составной ключ

2) Присвойте каждому шарду свой идентификатор и установите диапазоны идентификаторов для каждого шарда

3) Используйте глобально уникальный идентификатор - GUID

3 голосов
/ 25 апреля 2009

Два подхода, которые я использовал для решения этой проблемы:

  • GUID: Простота реализации, хотя и создает большие таблицы и индексы.
  • ID Domain: я придумал этот термин, но в основном это означает разделение 32 (или 64) бит целочисленного типа на две части, верхняя часть представляет домен. Количество битов, которое нужно использовать для домена, зависит от того, сколько доменов вы хотите поддерживать, а также количество записей, которые вы ожидаете представить в одном домене. При таком подходе вы выделяете домен каждому шарду. Недостатком является то, что БД (о которых я знаю) не поддерживают этот подход напрямую, вам нужно самостоятельно распределить код по идентификатору.
1 голос
/ 25 апреля 2009

1) Вы можете две строки (одна указывает идентификатор, а вторая идентификатор базы данных)

2) Используйте направляющие

0 голосов
/ 28 октября 2012

У меня та же самая дилемма. Я думаю, что я пойду с решением Redis. Я буду использовать сервис типа redis-cloud.com для генерации уникальных идентификаторов. Таким образом, я все еще могу использовать bigint для всех данных, вставленных в мою зашифрованную таблицу. Это будет последовательным, поэтому разделение страниц не произойдет. Кроме того, пейджинг теперь очень легко сделать. Это решает проблему дружественных URL, потому что я не хотел использовать GUID в URL. Кроме того, облако Redis - это масштабируемое решение, очень надежное и с автоматическим переключением при сбое.

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

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

...