- Пострадает ли PostgreSQL от фрагментации индекса, когда PRIMARY KEY имеет тип UUID?
Да, это следовало ожидать.Но если вы собираетесь использовать стратегию COMB, этого не произойдет.Ряды будут всегда в порядке (это не совсем верно, но потерпите меня).
Кроме того, производительность между собственным pgsql UUID и VARCHAR не так уж отличается .Еще один момент для рассмотрения.
- Можно ли избежать фрагментации, если младшие 6 байтов GUID являются последовательными?
В моем тесте I 'мы обнаружили, что UUID1 (RFC 4122) является последовательным, в сгенерированный uuid уже добавлена временная метка.Но да, добавление метки времени в последние 6 байтов подтвердит этот порядок.Это то, что я сделал в любом случае, потому что, очевидно, временная метка уже не является гарантией порядка.Подробнее о COMB здесь
- Является ли COMB GUID, реализованный ниже, приемлемым и надежным способом создания последовательных GUID в Rails?
Я не использую рельсы, но я покажу вам, как я это сделал в django:
import uuid, time
def uuid1_comb(obj):
return uuid.uuid1(node=int(time.time() * 1000))
Где node
- 48-разрядное положительное целое число, идентифицирующее аппаратный адрес.
Что касается вашей реализации, то одним из основных преимуществ использования uuid является то, что вы можете безопасно генерировать их вне базы данных, поэтому использование вспомогательного класса является одним из допустимых способов сделать это.Вы всегда можете использовать внешний сервис для генерации uuid, такой как снежинка , но это может быть преждевременной оптимизацией на этом этапе.