14 ответов:
технически да, но если строка имеет смысл быть первичным ключом, то вы, вероятно, должны использовать его. Все это зависит от размера таблицы, для которой Вы ее создаете, и длины строки, которая будет первичным ключом (более длинные строки == сложнее сравнивать). Я бы не обязательно использовал строку для таблицы, которая имеет миллионы строк, но количество замедления производительности, которое вы получите, используя строку на меньших таблицах, будет незначительным для головных болей, которые вы можете иметь имея целое число, которое ничего не значит по отношению к данным.
еще одна проблема с использованием строк в качестве первичного ключа заключается в том, что, поскольку индекс постоянно помещается в последовательный порядок, когда создается новый ключ, который будет находиться в середине порядка, индекс должен быть повторно упорядочен... если вы используете целое число auto number, новый ключ просто добавляется в конец индекса.
вставки в таблицу с кластеризованным индексом, где вставка происходит в середине последовательности, не приводят к перезаписи индекса. Это не приводит к переписыванию страниц, содержащих данные. Если на странице есть место, куда пойдет строка, то она помещается на эту страницу. Одна страница будет переформатирована, чтобы поместить строку в нужное место на странице. Когда страница заполнена, происходит разделение страницы, причем половина строк на странице переходит на одну страницу, а половина-на другую иду на другой. Затем страницы повторно связываются в связанный список страниц, содержащих табличные данные с кластеризованным индексом. В лучшем случае, вы будете в конечном итоге писать 2 страницы базы данных.
струны медленнее в соединениях и в реальной жизни они очень редко действительно уникален (даже, когда они должны быть). Единственным преимуществом является то, что они могут уменьшить количество соединений, если вы присоединяетесь к основной таблице только, чтобы получить имя. Тем не менее, строки также часто могут быть изменены, что создает проблему необходимости исправить все связанные записи, когда меняется название компании или человек женится. Это может быть огромный удар по производительности, и если все таблицы, которые должны быть связаны как-то не связаны (это происходит чаще, чем вы думаете), то у вас могут быть несоответствия данных, а также. Целое число, которое никогда не изменится в течение срока службы записи, является гораздо более безопасным выбором как с точки зрения целостности данных, так и с точки зрения производительности. Естественные ключи обычно не очень хороши для поддержания данных.
Я также хочу отметить, что лучшим из обоих миров часто является использование автоинкрементного ключа (или в некоторых специализированных случаях GUID) в качестве PK, а затем поместите уникальный индекс на естественный ключ. Вы получаете более быстрые соединения, вы не получаете повторяющиеся записи, и вам не нужно обновлять миллион дочерних записей, потому что имя компании изменилось.
не имеет значения, что вы используете в качестве первичного ключа, если он уникален. Если вы заботитесь о скорости или хорошем дизайне базы данных, используйте int, если вы не планируете реплицировать данные, а затем используйте GUID.
Если это база данных доступа или какое-то крошечное приложение, то кто действительно заботится. Я думаю, что причина, по которой большинство из нас разработчиков хлопают по старому int или guid на фронте, заключается в том, что проекты имеют способ расти на нас, и вы хотите оставить себе возможность расти.
слишком много переменных. Это зависит от размера таблицы, индексов, характера строкового ключевого домена...
вообще, целые числа будут быстрее. Но будет ли разница достаточно большой, чтобы заботиться? Трудно сказать.
кроме того, какова ваша мотивация для выбора строк? Числовые ключи автоматического приращения часто так много легче как хорошо. Это семантика? Удобство? Репликация / отключенные проблемы? Ваш ответ здесь может ограничить ваши параметры. Это также напоминает о третьем "гибридном" варианте, который вы забываете: Guids.
Не беспокойтесь о производительности, пока вы не получите простой и звуковой дизайн, который согласуется с предметом, который описывают данные, и хорошо соответствует предполагаемому использованию данных. Затем, если возникают проблемы с производительностью, вы можете справиться с ними, настроив систему.
в этом случае почти всегда лучше использовать строку в качестве естественного первичного ключа, если вы можете доверять ей. Не волнуйтесь, если это строка, если строка достаточно короткая, скажем, около 25 символы макс. Вы не будете платить большую цену с точки зрения производительности.
всегда ли люди ввода данных или автоматические источники данных предоставляют значение для предполагаемого естественного ключа или иногда опускаются? Это иногда неправильно во входных данных? Если да, то как обнаруживаются и исправляются ошибки?
могут ли программисты и интерактивные пользователи, которые задают запросы, использовать естественный ключ, чтобы получить то, что они хотят?
Если вы не можете доверять естественному ключу, придумайте суррогат. Если вы изобрели суррогат, вы можете также изобрести целое число. Тогда вам придется беспокоиться о том, чтобы скрыть суррогат от сообщества пользователей. Некоторые разработчики, которые не скрывали суррогатный ключ, пожалели об этом.
да, но если вы не ожидаете иметь миллионы строк, не используя строковый ключ, потому что он медленнее, как правило, "преждевременная оптимизация."В конце концов, строки хранятся как большие числа, а цифровые клавиши обычно хранятся как меньшие числа.
однако следует обратить внимание на то, что у вас есть кластеризованные индексы на любом ключе и вы делаете большое количество вставок, которые не являются последовательными в индексе. Каждая записанная строка приведет к перезаписи индекса. если вы делаете пакетные вставки, это может действительно замедлить процесс.
индексы подразумевают множество сравнений.
Иногда, однако, быстрее использовать строку в качестве первичного ключа, чем создавать дополнительное соединение с
string to numerical idтаблица.
две причины использовать целые числа для столбцов PK:
мы можем установить идентификатор для целочисленного поля, которое увеличивается автоматически.
когда мы создаем PKs, БД создает индекс (кластер или не кластер), который сортирует данные, прежде чем они будут сохранены в таблице. При использовании идентификатора на ПК оптимизатору не нужно проверять порядок сортировки перед сохранением записи. Это повышает производительность на больших таблицах.
по какой причине у вас есть строка в качестве первичного ключа?
Я бы просто установил первичный ключ для автоматического увеличения целочисленного поля и поместил индекс в строковое поле.
таким образом, если вы выполняете поиск по таблице, они должны быть относительно быстрыми, и все ваши соединения и обычные поисковые запросы не будут затронуты их скоростью.
вы также можете управлять количеством строкового поля, которое индексируется. Иными словами, вы можете сказать "индексировать только первые 5 символов" если вы думаете, что будет достаточно. Или если ваши данные могут быть относительно похожи, вы можете индексировать все поле.
с точки зрения производительности-да строка(PK) замедлит производительность по сравнению с производительностью, достигнутой с помощью целого числа (PK), где PK ---> первичный ключ.
с точки зрения требований-хотя это не часть вашего вопроса, все же я хотел бы упомянуть. Когда мы обрабатываем огромные данные в разных таблицах, мы обычно ищем вероятный набор ключей, которые могут быть установлены для конкретной таблицы. Это, в первую очередь, потому что есть много таблиц и в основном каждая или некоторая таблица будет связана с другой через некоторое отношение ( понятие внешнего ключа ). Поэтому мы действительно не всегда можем выбрать целое число в качестве первичного ключа, скорее мы идем на комбинацию 3, 4 или 5 атрибутов в качестве первичного ключа для этой таблицы. И эти ключи могут быть использованы в качестве внешнего ключа, когда мы сравним записи с какой-то другой таблице. Это позволяет при необходимости связать записи между различными таблицами.
поэтому для оптимального использования - мы всегда составляйте комбинацию из 1 или 2 целых чисел с 1 или 2 строковыми атрибутами, но только если это необходимо.
может быть очень большое недоразумение, связанное со строкой в базе данных. Почти все думали, что представление базы данных чисел более компактно, чем для строк. Они думают, что в db-s числа представлены как в памяти. Но это не так. В большинстве случаев числовое представление ближе к строковому представлению как к другому.
скорость использования числа или строки больше зависит от индексации, чем от самого типа.
по умолчанию ASPNetUserIds 128 строк символов и производительность просто отлично.
Если ключ и чтобы быть уникальным в таблице, это должен быть ключ. Вот почему;
первичный строковый ключ = правильные отношения БД, 1 строковый ключ(первичный) и 1 строковый индекс (первичный).
другой вариант является типичным ключом int, но если строка и чтобы быть уникальным, вам все равно, вероятно, нужно добавить индекс из-за нон-стоп запросы для проверки или проверки его уникальности.
чтобы использовать int identity key = неправильные отношения БД, 1 int key(Primary), 1 int index(Primary), вероятно, уникальный строковый индекс, и вручную для проверки одной и той же строки не существует (что-то вроде проверки sql, возможно).
чтобы получить лучшую производительность, используя int над строкой для первичного ключа, когда строка и чтобы быть уникальным, это должно быть очень странно ситуация. Я всегда предпочитал использовать строковые ключи. И как хорошее эмпирическое правило, не денормализуйте базу данных, пока вы нужно для.
Comments