Я хотел бы построить распределенную систему. Мне нужно хранить данные в базах данных, и было бы полезно использовать UUID или GUID в качестве первичного ключа для некоторых таблиц. Я предполагаю, что у этого дизайна есть недостатки, так как UUID / GUID довольно большой, и они почти случайны. Альтернатива - использовать автоматически увеличенный INT или LONG.
Каковы недостатки использования UUID или GUID в качестве первичного ключа для моих таблиц?
Я, вероятно, буду использовать Derby / JavaDB (на клиентах) и PostgreSQL (на сервере) в качестве СУБД.
Ответы:
Это зависит от вашей функции генерации и размера финальных столов
GUID предназначены для глобально уникальных идентификаторов. Как обсуждалось в документации Postgres 8.3 , нет методологий, универсально подходящих для генерации этих идентификаторов, но postgreSQL поставляется с несколькими более полезными кандидатами.
Исходя из масштабов вашей проблемы и необходимости автономной записи, вы довольно аккуратно исключили использование чего-либо, кроме GUID, и, следовательно, нет никаких компенсаторных преимуществ других схем.
С функциональной точки зрения длина ключа обычно не является проблемой в любой современной системе, в зависимости от количества операций чтения и размера таблицы. В качестве альтернативной методологии автономные клиенты могут пакетировать новые записи без первичного ключа и просто вставлять их при повторном подключении. Поскольку postgreSQL предлагает тип данных «Serial», клиентам никогда не потребуется определять ID, если они могут выполнять простую запись в базу данных.
источник
{Node_ID, Item_ID}
где у каждого узла естьNode_ID
, иItem_ID
автоматически увеличивающийся для каждого узла.Еще один совет - никогда не используйте GUID как часть кластерного индекса. Идентификаторы GUID не являются последовательными, поэтому, если они являются частью кластерного индекса, при каждом добавлении новой записи базе данных потребуется переставлять все страницы своей памяти, чтобы найти подходящее место для вставки, в случае автоматического увеличения int (bigint) она будет только последняя страница.
Теперь, если мы посмотрим на некоторые реализации БД: 1.) MySQL - первичные ключи кластеризованы, без возможности изменить поведение - рекомендуется вообще не использовать GUID здесь 2.) Postgres, MS-SQL - вы можете сделать GUID как первичный ключ некластеризован и использует другое поле в качестве кластерного индекса, например, autoincrement int
источник
database would need to rearrange all its memory pages to find the right place for insertion
=> Я не думаю, что это имеет место с Postgres, поскольку кластеризация является необязательной, а новые строки хранятся неупорядоченными.По-разному.
Серьезно, со всем, что вы дали, это примерно настолько, насколько вы можете пойти.
Почему было бы полезно использовать UUID? Почему вы не будете использовать INT? Почему вы не можете просто индексировать UUID позже? Вы понимаете, что значит иметь отсортированный список с ключом UUID и вставлять случайный (непоследовательный) UUID после нескольких миллионов строк?
На какой платформе это будет работать? Сколько дисков? Сколько пользователей? Сколько записей?
источник