Неправильно ли иметь текст в качестве первичного ключа в базе данных SQLite? Я слышал, что это плохо по соображениям производительности, это правда? И будет ли rowid использоваться в качестве фактического первичного ключа в таком случае?
Использование текста в качестве первичного ключа в таблице SQLite плохо?
Ответ 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