Использование GUID лениво - то есть, администратор БД не может быть обеспокоен тем, чтобы правильно моделировать свои данные. Также он предлагает очень плохую производительность соединения - обычно (16-байтовый тип с плохой локальностью).
Это плохой дизайн, если я хочу иметь столбец GUID в качестве моего типичного первичного ключа и отдельный столбец int для моего идентификатора кластеризации, а в качестве дополнительного бонуса - «удобный для пользователя» идентификатор?
Да, это очень плохо - во-первых, вам не нужно более одного «искусственного» ключа-кандидата для вашей таблицы. Во-вторых, если вы хотите, чтобы в качестве ключей использовался удобный идентификатор, просто используйте тип фиксированной длины, такой как char [8] или binary (8) - предпочтительно двоичный, так как сортировка не будет использовать локаль; вы можете использовать 16-байтовые типы, однако вы заметите ухудшение производительности, но не так плохо, как GUID. Вы можете использовать эти фиксированные типы для создания собственной удобной схемы размещения, которая сохраняет некоторую локальность, но генерирует разумные и значимые идентификаторы.
В качестве примера:
Если вы пишете какую-то систему CRM (скажем, онлайн-котировки) и вам нужен чрезвычайно удобный для пользователя тип, например, ссылка на страховую цитату (QR), которая выглядит так: «AD CAR MT 122299432».
В этом случае - поскольку длина кавычки огромна - я бы создал отдельную LUT / Symboltable для разрешения ссылки на кавычку на фактический используемый идентификатор. но я отделю это LUT от остальной части модели, я никогда не буду использовать ссылку на цитату где-либо еще в модели, особенно в таблице, представляющей QR .
Create Table QRLut
{
bigint bigint_id;
char(32) QR;
}
Теперь, если в моей модели есть одна таблица, представляющая QR, и 20 других таблиц, в которых bigint QR используется в качестве внешнего ключа - тот факт, что используется bigint, позволит моей БД масштабироваться лучше - чем шире предикаты объединения, тем шире на шине памяти возникает больше конфликтов - и количество конфликтов на шине памяти определяет, насколько хорошо ваш ЦП может быть насыщен (несколько ЦП).
В этом примере вы можете подумать, что вы можете просто поместить удобный для пользователя QR в таблицу, которая фактически представляет цитату, однако имейте в виду, что SQL-сервер собирает статистику по таблицам и индексам, и вы не хотите позволять сервер принимает решения о кэшировании на основе удобного QR-кода, поскольку он огромен и бесполезен.