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

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

Ответ 1

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

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

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

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

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

А также есть следующие вопросы, которые следует учитывать:

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

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

И что такое заключение?

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

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

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

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

1 В реальных строках редко уникальны.

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 4

Да, если вы используете TEXT, вы получаете android.database.sqlite.SQLiteConstraintException: ограничение UNIQUE не удалось: TableName.ColumnName (код 1555)

SQLite имеет сеанс для вставки и возврата идентификатора строки последней вставленной строки, если эта вставка успешно выполнена. else вернет -1.

return сопоставляется с _ID, это причина, по которой они вызывают интерфейс BaseColumns для таблицы

странно, что вызов insert должен возвращать rowid, а не логическое или так

Я хочу, чтобы TEXT PRIMARY KEY появилась в sqlite