На стороне базы данных я понимаю, что естественный первичный ключ является предпочтительным, если он не является чрезмерно длинным, что может вызвать проблемы с индексированием. Но когда я читаю проекты, которые используют sqlalchemy с помощью поиска кода Google, я почти всегда нахожу что-то вроде:
class MyClass(Base):
__tablename__ = 'myclass'
id = Column(Integer, primary_key=True)
Если у меня есть простой класс, например тег, где я только планирую хранить одно значение и в любом случае нуждаюсь в уникальности, что я получу через суррогатный первичный ключ, когда я использую sqlalchemy? Одна из книг SQL, которые я читаю, предполагает, что ORM является законным использованием "антипаттера", но ORM, который он предполагает, больше похож на ActiveRecord или Django. Это выглядит несколько мест в моей модели, но вот одно:
class Tag(Base):
__tablename__ = 'tag'
id = Column(Integer, primary_key=True) #should I drop this and add primary_key to Tag.tag?
tag = Column(Unicode(25), unique=True)
....
В моей более широкой реляционной модели тег имеет несколько отношений "многие ко многим" с другими объектами. Таким образом, будет несколько промежуточных таблиц, которым нужно хранить более длинный ключ. Должен ли я выбирать тег или идентификатор для моего первичного ключа?
Хотя ORM или языки программирования делают некоторые способы использования более удобными, чем другие, я думаю, что выбор первичного ключа - это проблема проектирования базы данных, не связанная с ORM. Более важно получить схему базы данных на собственном основании. Как правило, базы данных живут дольше, чем код, который обращается к ним.
Найдите SO (и google) для получения более общих вопросов о том, как выбрать первичный ключ, например: https://stackoverflow.com/search?q=primary+key+natural+surrogate+database-design (суррогатное или натуральное/бизнес-ключи, Вопрос проектирования реляционной базы данных - Суррогатный ключ или Натуральный ключ?, Когда не использовать суррогатные первичные ключи?...)
Я предполагаю, что таблица Tag
не будет очень большой или очень динамичной. В этом случае я бы попытался использовать tag
в качестве первичного ключа, если нет важных причин для добавления первичного ключа невидимого в конечный пользователь, например:
низкая производительность по данным реального мира (измеренная, не предполагаемая),
частые изменения имен тегов (но тогда я бы по-прежнему использовал некоторую уникальную строку на основе первого имени тега в качестве ключа),
невидимое закулисное слияние тегов (но, см. предыдущий пункт),
проблемы с разными сопоставлениями - сравнение международных данных - в вашей РСУБД (но,...)
...
В целом я заметил, что люди склонны ошибаться в обоих направлениях:
используя сложные многополевые "естественные" ключи (где отдельные поля сами являются непрозрачными числами), когда строки таблицы имеют свою собственную идентификацию и получат выгоду от наличия собственных суррогатных идентификаторов,
путем введения случайных числовых кодов для всего, вместо использования коротких значащих строк.
Значимые значения первичного ключа - если это возможно - окажутся полезными при просмотре базы данных вручную. Вам не понадобятся несколько объединений, чтобы выяснить ваши данные.
Лично я предпочитаю суррогатные ключи в большинстве мест; Двумя основными причинами этого являются 1) целые ключи, как правило, меньше/быстрее и 2) Обновление данных не требует каскадов. Этот второй момент является довольно важным для того, что вы делаете; Если в таблице тегов содержится несколько таблиц, ссылающихся на таблицу тегов, помните, что если кто-то хочет обновить тег (например, для исправления ошибки орфографии/случая или для использования более/менее определенного слова и т.д.), Обновление будет необходимо выполнять во всех таблицах одновременно.
Я не говорю, что вы никогда не должны использовать естественный ключ. Если я уверен, что естественный ключ никогда не будет изменен, я рассмотрю естественный ключ. Просто будьте уверены, иначе это станет болью для поддержания.
Всякий раз, когда я вижу людей (сверх) с помощью суррогатных ключей, я помню статьи блога Роя Хэнна по этой теме, особенно вторую и третью статью:
http://community.actian.com/forum/blogs/rhann/127-surrogate-keys-part-2-boring-bit.html
http://community.actian.com/forum/blogs/rhann/128-surrogate-keys-part-3-surrogates-composites.html
Я настоятельно рекомендую людям читать их, поскольку эти статьи исходят от человека, который провел несколько десятилетий в качестве эксперта по базам данных.
В настоящее время суррогатное ключевое использование напоминает мне о ранних годах 21 века, когда люди использовали XML буквально во всем, как там, где он действительно принадлежал, так и там, где он не принадлежал.