Использование текста в качестве первичного ключа в таблице SQLite плохо?
Плохо ли иметь текст в качестве первичного ключа в базе данных SQLite? Я слышал, что это плохо по причинам производительности, это правда? И будет ли rowid использоваться в качестве фактического первичного ключа в таком случае?
3 ответов:
Я никогда не слышал, чтобы кто-то использовал строку в качестве первичного ключа в таблице. Для меня (и я честно надеюсь также для других) очень "уродливая" практика с очень низкой производительностью.Плохо ли иметь текст в качестве первичного ключа в базе данных SQLite? Я слышал что это плохо по причинам производительности, это правда?
Если вы будете использовать строку в качестве первичного ключа, вам нужно подумать о "нескольких" вещах:
- будет комбинация из 3 символов достаточно?
- или я должен использовать 5 символов?
Здесь каждая строка должна иметь одинаковый формат (вопрос читаемости, конечно), а также быть уникальной. О! Вот следующая "поросячья работа"
->вам нужно будет создать некоторый "генератор уникальных строк" , который будет генерировать уникальные1 строковый идентификатор2.А также есть следующие вопросы, которые хорошо рассмотреть:
- Более длинные строки
=автоматически труднее и труднее сравнить- размер таблицы радикально возрастает, потому что совершенно ясно, что строка имеет гораздо больший размер, чем число
- количество строк-это безумие использовать строку в качестве первичного ключа, если вы таблица может иметь 1000 + строк
Это более сложная тема, но я хотел бы сказать, что хорошо, для очень маленьких таблиц можно было бы использовать строки в качестве первичного ключа (если это имеет смысл), но если вы посмотрите на недостатки, это гораздо более лучший метод использовать число в качестве первичного ключа для конечно!
А что такое заключение?
Я не рекомендую вам использовать строку в качестве первичного ключа. У него больше недостатков, чем преимуществ (у него действительно есть какое-то преимущество?).
Использование числа в качестве первичного ключа гораздо более лучшая (боюсь сказать лучшая) практика.
И будет ли rowid использоваться в качестве фактического первичного ключа в таком случае?
Если вы будете использовать строку в качестве основной, то нет.
1в Реале струны бывают редко уникальный.
2конечно, можно сказать, что вы можете создать идентификатор из имени элемента в строке, но это снова спагетти-код (элементы могут иметь одно и то же имя).
Плохо ли иметь текст в качестве первичного ключа в базе данных SQLite? Я слышал, что это плохо по причинам производительности, это правда?
С точки зрения корректности,
TEXT PRIMARY KEYвсе в порядке.С точки зрения производительности предпочтите ключи
INTEGER. Но, как и в случае с любой проблемой производительности, измерьте ее самостоятельно, чтобы увидеть, есть ли существенная разница с вашими данными и вариантами использования.И будет ли rowid использоваться в качестве фактического первичного ключа в таком случае?
Только
INTEGER PRIMARY KEYполучает псевдоним сROWID. Другие типы первичных ключей этого не делают, и будет неявный целочисленный rowid, если не указанWITHOUT ROWID. Ссылка .
В реальном мире использование строк в качестве первичного ключа имеет много преимуществ, если мы говорим о UUIDs. Возможность создания сущности "паспорт" именно в момент ее создания позволяет значительно упростить асинхронный код и / или распределенную систему (если речь идет о более сложной мобильной клиент-серверной архитектуре).
Что касается производительности, я не нашел никакой измеримой разницы при запуске бенчмарка для выполнения 10000 первичных ключевых поисков, как в действительности, индексы базы данных не хранить и не сравнивать строки при выполнении индексированного поиска.
Comments