Есть еще несколько техник, у каждой есть свои плюсы и минусы. Но позвольте мне начать с указания двух методов, которые в какой-то момент касаются кирпичной стены при увеличении масштаба. Предположим, у вас есть миллиарды элементов, которые, вероятно, разбросаны по нескольким серверам с помощью сегментирования или других методов.
Кирпичная стена №1: UUID удобны, потому что клиенты могут создавать их, не запрашивая значения у какого-то центрального сервера. Но UUID очень случайны. Это означает, что в большинстве ситуаций каждая ссылка вызывает попадание на диск, потому что идентификатор вряд ли будет кэширован.
Кирпичная стена # 2: попросите центральный сервер, у которого есть AUTO_INCREMENT
под крышкой, разрешить из идентификаторов. Я смотрел сайт в социальной сети, который из-за этого ничего не делал, кроме сбора изображений для обмена cra sh. И это несмотря на то, что существует сервер, единственная цель которого - раздавать числа.
Решение №1:
Вот одно (из нескольких) решений, которое позволяет избежать большинства проблем: иметь центральный сервер, который раздает 100 идентификаторов за раз. После того, как клиент израсходовал предоставленные 100, он запрашивает новую партию. В случае сбоя клиента некоторые из последних 100 «теряются». Ну что ж; ничего страшного.
Это решение в 100 раз лучше кирпичной стены №2. И идентификаторы гораздо менее случайны, чем идентификаторы кирпичной стены №1.
Решение №2: Каждый клиент может генерировать свои собственные 64-битные полупоследовательные идентификаторы. Номер включает номер версии, некоторые часы, часть дедупликации и идентификатор клиента. Так что это примерно в хронологическом порядке (по всему миру) и гарантированно будет уникальным. Но все же есть хорошая локальность ссылок для элементов, созданных примерно в то же время.
Примечание: мои методы могут быть адаптированы для использования в отдельных таблицах или в качестве убер-числа для всех таблиц. Это различие могло быть вашим «настоящим» вопросом. (Другие ответы касаются этого.)