Насколько сильно мне следует избегать суррогатных первичных ключей в SQL? - PullRequest
2 голосов
/ 15 сентября 2010

Короткая история
У меня есть техническая проблема со сторонней библиотекой, которую я, кажется, не могу легко решить иным способом, чем создание суррогатного ключа (несмотря на то, чточто мне это никогда не понадобится).Я прочитал несколько статей в Сети, не одобряющих использование суррогатных ключей, и я немного растерялся, если можно делать то, что я собираюсь сделать.

Длинная история
Мне нужно указать первичный ключ, потому что я использую SQLAlchemy ORM (который требует один), и я не могу просто установить его в __mapper_args__, так как класс создается с помощью classobj, и мне еще предстоитнайдите способ сослаться на поле еще не существующего класса в соответствующем аргументе определения PK.Другая проблема заключается в том, что естественным эквивалентом PK является составной ключ, который слишком длинен для версии MySQL, которую я использую (и, как правило, плохая идея использовать такие длинные первичные ключи в любом случае).

Ответы [ 3 ]

2 голосов
/ 15 сентября 2010

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

Итак, вы выполнили свою работу, признав, что в сети есть «документы» с вескими причинами, чтобы избежать суррогатных ключейи что, вероятно, есть лучший способ сделать это.

Теперь напишите "# TODO: find a way to avoid surrogate keys" где-нибудь в вашем исходном коде и приступайте к работе.

0 голосов
/ 12 ноября 2010

Я использую суррогатные ключи в БД, в которых я использую отражение с sqlalchemy.Преимущество в том, что вы можете легче управлять внешними ключами / отношениями, которые существуют в ваших таблицах / моделях.Кроме того, rdbms управляет данными более эффективно.Кон - несоответствие данных: дубликаты.Чтобы избежать этого - всегда используйте уникальное ограничение на ваш естественный ключ.

Теперь я понимаю из вашей длинной истории , что вы не можете применить эту уникальность из-заваши ограничения mysql.Для длинных составных ключей mysql вызывает проблемы.Я предлагаю вам перейти на postgresql.

0 голосов
/ 15 сентября 2010

«Использование суррогатного ключа позволяет создавать дубликаты при использовании естественного ключа, что предотвратило бы такие проблемы» Точно, поэтому вы должны иметь оба ключа, а не просто суррогат.Ошибка, которую вы, похоже, делаете, заключается не в том, что вы используете суррогат, а в том, что вы предполагаете, что таблице нужен только один ключ.Убедитесь, что вы создали все ключи, необходимые для обеспечения целостности ваших данных.

Сказав это, в этом случае это выглядит как недостаток программного обеспечения ORM (очевидно, не в состоянии использовать составной ключ)настоящая причина ваших проблем.К сожалению, такое ограничение программного обеспечения должно вынудить вас создавать ключи, которые вам больше не нужны.Может быть, вы могли бы рассмотреть возможность использования другого программного обеспечения.

...