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:
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:
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:
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?
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
@JNK Dobra uwaga, należy pamiętać o wpływie fizycznego przechowywania. –
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) –