Hibernate композитный ключ или суррогатный ключ

Я должен спроектировать таблицу для хранения некоторых удаленных данных. У данных, которые я получаю через веб-сервис, есть ключ-кандидат, комбинация из двух столбцов, но я видел несколько постов, в которых они не рекомендуют использовать составной ключ в спящем режиме, а рекомендуют использовать суррогатный ключ. Если я создаю таблицу с использованием составного ключа, тогда я могу обновить данные напрямую, но если я использую суррогатный ключ, то мне нужно сначала получить первичный ключ перед обновлением. У меня вопрос, какой из них я должен использовать, составной ключ или суррогатный ключ?

1 ответ

Скажи нет композитному ключу, потому что...

  • Они неэффективны (зависит от базы данных)
  • громоздкий в использовании
  • Больше параметров вместо одного
  • склонен к ошибкам
  • Может привести к дублированию данных, если у нас более одного столбца в качестве составного ключа

Следовательно, предлагается суррогатный ключ. Хотя у него есть свои недостатки

  • Проблемы с производительностью
  • Подвержен ошибкам
  • дупликация

Как указано в Java Persistence со ссылкой на Hibernate:

Более опытные пользователи Hibernate используют исключительно saveOrUpdate(); гораздо проще позволить Hibernate решать, что нового, а что старого, особенно в более сложной сети объектов со смешанным состоянием. Единственный (не очень серьезный) недостаток исключительного saveOrUpdate() заключается в том, что он иногда не может угадать, является ли экземпляр старым или новым, не вызывая SELECT в базе данных - например, когда класс отображается с помощью естественного составного ключа и нет версии или свойства метки времени.

Некоторые проявления ограничения можно найти здесь.

Поэтому используйте естественные ключи, когда это уместно, и используйте суррогатные ключи, когда их лучше использовать.

Другие вопросы по тегам