Mam pytanie "najlepsza praktyka" dla scenariusza.Mapowanie hibernacji: jedna kolumna na wiele tabel
Scenariusz: Wiele podmiotów w bazie danych, na przykład Dokument, BlogPost, Wiki mogą być udostępniane przez użytkowników indywidualnych. Zamiast tworzenia tabeli udziałów dla każdej jednostki, tworzona jest pojedyncza tabela Udziałów. Problem polega na tym, jak zmapować tabelę udziałów z różnymi jednostkami?
Mam trzy opcje, proszę doradzić, która opcja jest najlepsza, a jeśli jest lepsza opcja.
Opcja 1: Tworzenie Akcji tabeli jako:
SHARES
id (unique)
entityId (non DB enforced FK to DOCUMENTS, WIKIS, POSTS etc.)
entityType
sharedBy
sharedWith
sharedDate
Tutaj identyfikator podmiotu będzie FK do documentId, wikiId, postID itp itd i entityType będzie tożsamość jaki rodzaj identyfikator podmiotu jest.
ten ma problemy w modelowaniu hibernacji, podczas tworzenia Wyślij do mapowania jednostki, takie jak share.getDocument() lub() itp share.getWiki
Opcja 2: Tworzenie Akcji stół, który posiada jedynie udziały informacje, a następnie utworzyć tabele rozdzielczości, które wiążą udział z jednostką.
SHARES
id(PK)
sharedBy
sharedWith
sharedDate
shareType (helper field for searches)
SHARES_DOCUMENTS
share_id (unique ID and FK, one to one with SHARES)
document_id (FK to DOCUMENTS)
SHARES_POST
share_id (unique ID and FK, one to one with SHARES)
post_id (FK to POSTS)
more share tables here.
Więc hibernacji mądry, Udział może mieć jeden do jednego dla każdego z rodzajów akcji (jak share.getDocument(), share.getPost() i shareType będzie zidentyfikować związek jest „aktywny”)
Wariant 3 Podobnie jak w wariancie 1, ale zamiast tworzyć poszczególne kolumny podmiotu id
SHARES
id (unique ID)
documentId (FK to DOCUMENTS, nullable)
postId (FK to POSTS, nullable)
wikiId (FK to WIKIS, nullable)
sharedBy
sharedWith
sharedDate
sharedType
Tutaj, każda kolumna może być odwzorowany do danego podmiotu, ale są one pustych. Metoda sharedType może określić, która relacja jest "aktywna".
Pytanie brzmi więc, która praktyka jest najlepsza, zarówno w zakresie mapowania, jak i mapowania hibernacji (i ewentualnych zapytań, pod względem wydajności).
Dzięki M. Raczej
Wystarczy popatrzeć na http://docs.jboss.org/hibernate/core/3.3/reference/en/html/inheritance.html –
Dzięki, przyjrzę się temu. Ale czy to naprawdę kwestia dziedziczenia? Lub dziedziczenie może być użyte do rozwiązania tego problemu. Jeśli każda z tabel rozdzielczości ma dodatkowe informacje pochodne, mogą kwalifikować się do dziedziczenia, ale po prostu zawierają relację z różnymi podmiotami. Ponadto większość przykładów/dokumentacji dziedziczenia nie próbuje utworzyć pojedynczego łącza do kolumn z różnymi obiektami. Mają naprawdę niezależne pola, które je definiują. –
W drugiej chwili relacje z różnymi podmiotami "definiują je dalej". Przyjrzę się wielu klasom z opcją pojedynczej tabeli i zobaczę, jak to działa. –