Hibernate композитный ключ или суррогатный ключ
Я должен спроектировать таблицу для хранения некоторых удаленных данных. У данных, которые я получаю через веб-сервис, есть ключ-кандидат, комбинация из двух столбцов, но я видел несколько постов, в которых они не рекомендуют использовать составной ключ в спящем режиме, а рекомендуют использовать суррогатный ключ. Если я создаю таблицу с использованием составного ключа, тогда я могу обновить данные напрямую, но если я использую суррогатный ключ, то мне нужно сначала получить первичный ключ перед обновлением. У меня вопрос, какой из них я должен использовать, составной ключ или суррогатный ключ?
1 ответ
Скажи нет композитному ключу, потому что...
- Они неэффективны (зависит от базы данных)
- громоздкий в использовании
- Больше параметров вместо одного
- склонен к ошибкам
- Может привести к дублированию данных, если у нас более одного столбца в качестве составного ключа
Следовательно, предлагается суррогатный ключ. Хотя у него есть свои недостатки
- Проблемы с производительностью
- Подвержен ошибкам
- дупликация
Как указано в Java Persistence со ссылкой на Hibernate:
Более опытные пользователи Hibernate используют исключительно saveOrUpdate(); гораздо проще позволить Hibernate решать, что нового, а что старого, особенно в более сложной сети объектов со смешанным состоянием. Единственный (не очень серьезный) недостаток исключительного saveOrUpdate() заключается в том, что он иногда не может угадать, является ли экземпляр старым или новым, не вызывая SELECT в базе данных - например, когда класс отображается с помощью естественного составного ключа и нет версии или свойства метки времени.
Некоторые проявления ограничения можно найти здесь.
Поэтому используйте естественные ключи, когда это уместно, и используйте суррогатные ключи, когда их лучше использовать.