Использование текста в качестве первичного ключа в таблице SQLite плохо?

плохо ли иметь текст в качестве первичного ключа в базе данных SQLite? Я слышал, что это плохо по причинам производительности, это правда? И будет ли rowid использоваться в качестве фактического первичного ключа в таком случае?

3 ответов


плохо ли иметь текст в качестве первичного ключа в базе данных SQLite? Я слышал что это плохо из-за производительности, это правда?

Я никогда не слышал, чтобы кто-то использовал строку в качестве первичного ключа в таблице. Для меня (и я честно надеюсь также на других) очень "некрасиво" потренирует С очень низкой производительностью.

Если вы будете использовать строку в качестве первичного ключа, вы должны думать о несколько вещей:

  • будет сочетание 3 символов достаточно?
  • или я должен использовать 5 символов?

здесь каждая строка должна иметь тот же формат (читаемость вопрос, конечно), а также быть уникальным. О! Вот следующий "копилка работ" -> вам нужно будет создать некоторые "уникальный генератор строку" это создаст уникальный1 строковый идентификатор2.

а также есть следующие вопросы-это хорошо подумайте:

  • более длинные строки = автоматически все труднее и труднее сравнивать
  • размер таблицы радикально повышается, потому что довольно ясно, что строка имеет гораздо больший размер как число
  • количество строк - это безумие, чтобы использовать строку в качестве первичного ключа, если вы таблица может иметь 1000+ строк

Это более сложная тема, но я хотел бы сказать, что ОК, для очень маленьких таблиц можно было бы использовать строки в качестве первичного ключа (если он делает sence), но если вы посмотрите на недостатки, гораздо лучше использовать номер в качестве первичного ключа наверняка!

и какой вывод?

Я не рекомендую вам использовать строку в качестве первичного ключа. У него больше недостатков как преимуществ (у него действительно есть какое-то преимущество?).

использование числа в качестве первичного ключа намного лучше (я боюсь сказать, лучший) практика.

и rowid будет использоваться как фактический первичный ключ в таком случае?

Если вы будете использовать строку в качестве основного не.

1в реальных строках редко бывают уникальными.

2конечно, вы можете сказать, что вы можете создать идентификатор из имени элемента в строке, но это еще раз код спагетти (элементы могут иметь то же имя).


плохо ли иметь текст в качестве первичного ключа в базе данных SQLite? Я слышал, что это плохо по причинам производительности, это правда?

С точки зрения правильности, TEXT PRIMARY KEY все в порядке.

С точки зрения производительности, предпочитают INTEGER ключи. Но, как и в случае с любой проблемой производительности, измерьте ее самостоятельно, чтобы увидеть, есть ли существенная разница с вашими данными и вариантами использования.

и rowid будет использоваться в качестве фактического первичный ключ в таком случае?

только INTEGER PRIMARY KEY получает псевдоним с ROWID. Другие виды первичных ключей этого не делают, и будет неявный целочисленный rowid, если это. ссылка.


в реальном мире использование строк в качестве первичного ключа имеет много преимуществ, если мы говорим о UUIDs. Возможность создания сущности "паспорт" именно в момент ее создания может значительно упростить асинхронный код и/или распределенную систему (если речь идет о более сложной архитектуре мобильного клиента / сервера).

Что касается производительности, я не нашел никакой измеримой разницы при запуске бенчмарка для выполнения 10000 поисков первичного ключа, как в действительности, база данных индексы не хранят и не сравнивают строки при выполнении индексированных поисков.