12

Zespół polimorficzny (PA) jest dość kęsny ze względu na stosunkowo proste wymagania dotyczące bazy danych: niech różne tabele zawierają rekordy podrzędne w jednym wspólnym stole. Klasycznym przykładem jest pojedyncza tabela z rekordami komentarza, które dotyczą różnych niekoniecznie spokrewnionych podmiotów.Jak zaimplementować powiązania polimorficzne w istniejącej bazie danych

W this question Mark wykonał świetną robotę, pokazując trzy wspólne podejścia do realizacji programów PA. Chcę użyć podejścia z tabelą podstawową, które jest opisane bardziej szczegółowo w równie doskonałym answer by Bill Karwin.

Konkretnym przykładem może wyglądać następująco:

enter image description here

kluczy podstawowych podmiotów odnoszą się do identycznych wartości kluczowych w tabeli bazowej i tabela komentarz odnosi się do tabeli bazowej, więc więzów integralności jest obserwowany. Kluczową częścią jest to, że klucze podstawowe tabel encji mają domeny odrębne. Są generowane przez utworzenie nowego rekordu w tabeli podstawowej i skopiowanie wygenerowanego klucza do klucza podstawowego jednostki.

Teraz moje pytanie: co jeśli chcę wprowadzić PA z integralnością referencyjną w istniejącej bazie danych posiadającej podmioty, które generują własne, wzajemnie pokrywające się klucze główne?

Dotychczas widzę dwie opcje:

Wariant 1:

Option 1

Każda jednostka prowadzi swój własny klucz podstawowy, ale także dostaje klucz alternatywny.

odczuwalna:

  • Blisko zalecanego podejścia.
  • Podstawowy stół jest stabilny.

lubię:

  • istniejących podmiotów muszą być modyfikowane.
  • Trudno znaleźć właściciela komentarza.

Opcja 2:

Option 2

Każda jednostka posiada własną kolumnę klucza obcego w tabeli bazowej. Wygląda to na wielokątowe podejście Marka.

odczuwalna:

  • istniejących podmiotów nie dotyczy.
  • Łatwo znaleźć właściciela komentarza.

lubię:

  • Rzadkie kolumny
  • tabela bazowa nie stabilny: wymaga modyfikacji, gdy zostaje wprowadzony nowy podmiot z PA

skłaniam się do opcji 1, ewentualnie z polem "EntityName" w tabeli Base dla dwukierunkowego wyszukiwania. Która opcja byłaby lepsza. A może inne, jeszcze lepsze podejście?

+0

Wariant 1 będzie łatwiejszy w utrzymaniu. Jeśli będziesz musiał dodawać kolumny do tabeli podstawowej, będzie to zarówno kłopotliwe, jak i wymagające wielu czynności konserwacyjnych z powodu podziału stron i wskaźników. – JNK

+0

@JNK Dobra uwaga, należy pamiętać o wpływie fizycznego przechowywania. –

+0

Możesz użyć opcji 1, ale nie z dodatkowym zastępczym kluczem alternatywnym. Nowy klucz alternatywny może być istniejącym kluczem podstawowym (każdej jednostki), rozszerzonym o kolumnę 'EntityType' (powiedzmy:" CHAR (1) ", która będzie" E "dla zdarzeń,' P' dla osób, 'D' dla produktów) –

Odpowiedz

9

Można użyć opcji 1, ale bez dodatkowego alternatywnego klucza zastępczego.

Zamiast rozszerzyć istniejący klucz podstawowy (każdej jednostki), z kolumną EntityType (słownie CHAR(1), że byłoby E dla Imprezy, P dla osób, D Produktów).

Związek (EntityId, EntityType) stanie się wówczas kluczem podstawowym tabeli Entity i odpowiednimi związkami w pozostałych 3 tabelach podtypów.

(The EntityType jest tylko auxilary tabela odniesienia, 3 rzędy)

Polymorphic_Associations