2008-12-22 15 views
31

Jakie są wskazówki/techniki dotyczące utrzymywania klas z dziedziczeniem w relacyjnej bazie danych, która nie obsługuje dziedziczenia?Techniki dziedziczenia bazy danych?

Say mam ten klasyczny przykład:

Person -> Employee -> Manager 
        -> Team lead 
        -> Developer 
     -> Customer -> PrivilegedCustomer 
        -> EnterpriseCustomer 

Jakie są dostępne techniki zaprojektować bazę danych? Plusy i minusy każdego?

p.s. Szukałem i znalazłem kilka pytań dotyczących dziedziczenia bazy danych, ale większość z nich dotyczyła zmiany silnika bazy danych, który obsługuje go natywnie. Ale załóżmy, że utknąłem z SQL Server 2005 ... jakie są moje opcje?

+0

Powiązane pytanie: http://stackoverflow.com/questions/190296/how-do-you-effectively-model-inheritance-ina-a-database –

Odpowiedz

27

Trzy wspólne strategie:

  1. utworzyć tabelę dla każdej klasy w hierarchii, które zawierają właściwości zdefiniowane dla każdej klasy i klucz obcy z powrotem do najwyższego poziomu nadklasy tabeli. Więc możesz mieć tabelę vehicle z innymi tabelami, takimi jak car i airplane, które mają kolumnę vehicle_id. Wadą jest to, że aby uzyskać jeden typ klasy, może być konieczne wykonanie wielu sprzężeń.

  2. Utwórz tabelę dla każdej klasy w hierarchii zawierającej wszystkie właściwości. To może być trudne, ponieważ nie jest łatwo utrzymać wspólny identyfikator we wszystkich tabelach, chyba że używasz czegoś podobnego do sekwencji. Zapytanie o typ nadklasy wymagałoby związków przeciwko wszystkim danym tabelom.

  3. Utwórz jedną tabelę dla całej hierarchii klas. Eliminuje to łączenia i związki, ale wymaga, aby wszystkie kolumny dla wszystkich właściwości klasy były w jednej tabeli. Prawdopodobnie będziesz musiał pozostawić większość kolumn zerowych, ponieważ niektóre kolumny nie będą miały zastosowania do zapisów innego typu. Na przykład tabela vehicle może zawierać kolumnę o nazwie , która odpowiada typowi Airplane. Jeśli ustawisz tę kolumnę na NIE NULL, wszelkie wstawione do tabeli wartości instancji Car będą wymagać wartości dla wingspan, mimo że wartość NULL może mieć więcej sensu. Jeśli pozostawisz kolumnę nullable, możesz obejść to z ograniczeniami kontroli, ale może to być brzydkie. (Single Table Inheritance)

+0

Złożoność zapytania dotyczyła mnie. Może to wymagać odrobiny sztuczek z części DAL, aby to naprawić. – chakrit

+2

Dla złożoności zapytania nr 3 brzmi najlepiej. Ponadto w niektórych systemach DBMS (takich jak Postgres) można wymusić brak wartości null dla każdego podtypu za pomocą ograniczenia sprawdzającego, nawet jeśli kolumny byłyby zerowe. –

+1

Nie wiem, czy to jest opcja, ale nie używasz 1. i używasz widoków do uzyskiwania dostępu do danych w ten sposób, że dostajesz tylko połączenia w jednym miejscu? – Peter

6

Uważaj na dziedziczenie baz danych w określonych sytuacjach - wdrożyliśmy go w naszej aplikacji do naszej strategii audytu, a skończyło się na wąskim gardłem wydajności/koszmarze.

Problem polegał na tym, że podstawową tabelą, której używaliśmy, była tylko wkładka i szybko się zmieniała, więc to, co otrzymaliśmy, to zakleszczenia: wszystkie nad tym miejscem. Obecnie planujemy podzielić je na osobne tabele, ponieważ ból głowy związany z posiadaniem tych samych kolumn w 15 różnych tabelach w porównaniu z koszmarem wydajności jest tego wart. Potęgowało to również to, że struktura podmiotu niekoniecznie skutecznie obsługuje dziedziczenie (jest to znany problem Microsoftu).

W każdym razie, po prostu myślę, że podzielę się wiedzą, odkąd przeszliśmy przez prasę w tej sprawie.

+0

Więc robiłeś # 1 i się przeprowadzasz (przeniosłeś) do # 2? (rozwiązań cliff.meyers) –