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



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

701   3  

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

    Ничего не найдено.