2011-01-02 13 views
5

Jak rozumiem, ilekroć używam @Id i @GeneratedValue na długim polu w jednostce JPA/Hibernate, używam w rzeczywistości zastępczego klucza i myślę, że jest to bardzo dobry sposób, aby zdefiniować klucz podstawowy biorąc pod uwagę moje niezbyt dobre doświadczenia w stosowaniu złożonych kluczy podstawowych, gdzie:Hibernate: Opinie w Composite PK vs Surrogate PK

  1. istnieje ponad 1 Biznes-value-kolumny kombinację, która stała się unikalnym PK
  2. z Złożone wartości pk powielone na całej powierzchni detali
  3. nie można zmienić wartości biznesowej wewnątrz tego kompozytu PK

Wiem, że hibernacja może obsługiwać oba typy PK, ale zastanawiam się przez moje poprzednie rozmowy z doświadczonymi kolegami, gdzie powiedzieli, że złożony PK jest łatwiejszy w obsłudze przy wykonywaniu złożonych zapytań SQL i procesów przechowywanych procedur.

Mówili dalej, że użycie zastępczych klawiszy komplikuje sytuację podczas łączenia i jest kilka sytuacji, w których niemożliwe jest wykonanie pewnych czynności przy użyciu zastępczych kluczy. Chociaż im przykro, nie mogę wyjaśnić szczegółów tutaj, ponieważ nie byłem wystarczająco jasne, kiedy to wyjaśnić. Może następnym razem przedstawię więcej szczegółów.

Próbuję obecnie wykonać projekt i spróbować wypróbować klucze zastępcze, ponieważ nie jest on duplikowany w tabelach i możemy zmienić wartości kolumny biznesowej. A gdy potrzeba pewnego wartości biznesowej skojarzonej wyjątkowości, mogę użyć czegoś takiego:

@Table(name="MY_TABLE", uniqueConstraints={ 
    @UniqueConstraint(columnNames={"FIRST_NAME", "LAST_NAME"}) // name + lastName combination must be unique 

Ale jestem nadal wątpliwości ze względu na poprzedniej dyskusji na temat klucza kompozytowego.

Czy możesz podzielić się swoimi doświadczeniami w tej sprawie? Dziękuję Ci !

Odpowiedz

10

Pierwsza zasada dotycząca każdej aplikacji to zmiana wymagań. Kropka. Tak więc coś, co wygląda jak dobry kandydat na PK dzisiaj, może nie być w ogóle PK w ogóle jutro.

Wartość jest dobrym kandydatem na PK, jeśli zawiera ona następujące cechy:

  1. To niezmienne. To się nigdy nie zmieni.
  2. Wyjątkowość. Dwa rekordy nigdy nie będą miały tego samego identyfikatora.

Powiedział, że jest prawie niemożliwe, aby mieć coś w realnym świecie z tymi cechami w sposób ciągły. Mam na myśli, nawet jeśli coś jest niezmienne i wyjątkowe dzisiaj, to nie znaczy, że zawsze tak będzie.

W miarę możliwości używaj zastępczych kluczy. Używaj kluczy naturalnych tylko dla starszych baz danych. I uciekajcie od znajomych, którzy sugerowali, że naturalne klucze są lepsze od surogatów (żartowanie) :-)

I oczywiście: można wymusić regułę unikalności z ograniczeniem w bazie danych (tak jak w przykładzie), uniemożliwienie dwóm zapisom podzielenia tej samej wartości, jeśli jest to reguła biznesowa. Kiedy logika biznesowa zmieni się w przyszłości, będziesz zadowolony, że użyłeś klucza zastępczego ;-)

Ale nie ufaj przypadkowemu kolesiu na stackoverflow za to.Przeczytaj te dwa artykuły z Wikipedii:

http://en.wikipedia.org/wiki/Surrogate_key

http://en.wikipedia.org/wiki/Natural_key

+0

dziękuję bardzo! – bertie

0

Hibernate wydaje się zachęcać do korzystania z kluczy zastępczych. Preferuję użycie kluczy złożonych, ale nie chcę walczyć z frameworkiem, a klucze złożone mogą być uciążliwe w pracy z Hibernate. Aby uzyskać najlepsze z obu światów, używam klucza zastępczego, ale również oznaczam moją potencjalną kolumnę klucza złożonego za pomocą @NaturalId, aby Hibernate tworzył dla mnie unikalne więzy. Domyślna mutabilitacja @NaturalId jest fałszywa, więc jeśli potrzebujesz zaktualizować pole "klucz złożony", użyj @ Naturalny identyfikator (zmienność = prawda).

Powiązane problemy