Nadtyp / podtyp decydujący o kategorii: całkowite rozłączne lub niepełne nakładanie się

11

Buduję bazę danych inwentarza, która przechowuje sprzęt IT, taki jak komputery stacjonarne, laptopy, przełączniki, routery, telefony komórkowe itp. Używam wzorca nadtypu / podtypu, w którym wszystkie urządzenia są przechowywane w jednej tabeli, a także konkretnych informacji jest umieszczany w tabelach podtypów. Moim dylematem są dwa następujące projekty:

wprowadź opis zdjęcia tutaj

Na górnym schemacie wszystkie urządzenia mają wspólne podtypy. Na przykład komputery stacjonarne i laptopy miałyby rekordy w następujących tabelach: Urządzenie, NetworkDevice. Przełącznik miałby rekordy w: Device, NetworkDevice. Router ma zapisy w: Device, NetworkDevice, WANDevice. Każde urządzenie, dla którego śledzimy lokalizację, będzie miało zapis w lokalizacji. Niektóre zalety i wady, o których pomyślałem dla tej konfiguracji:

  • Pro: WYBIERANIE rekordów na podstawie wspólnego pola, takiego jak nazwa hosta lub identyfikator lokalizacji jest łatwiejsze.
  • Pro: Brak pól zerowych.
  • Wada: tabele, które powinny być uwzględnione w operacjach CRUD dla konkretnego urządzenia, nie są oczywiste i mogą mylić przyszłe DBA.

Na dolnym schemacie wszystkie urządzenia mają swój własny podtyp (istnieje więcej klas urządzeń, których nie pokazano). W tej sytuacji oczywiste jest, które rekordy tabel zostaną wstawione lub wybrane. Komputery stacjonarne i laptopy działają w komputerze itp. Niektóre zalety i wady, o których pomyślałem dla tej konfiguracji:

  • Pro: od razu wiadomo, których tabel użyć do operacji CRUD dla podtypów.
  • Pro: Musisz używać tylko jednej tabeli do operacji CRUD.
  • Przeciw: WYBÓR rekordów na podstawie wspólnych pól podtypów wymaga połączenia wszystkich tabel, na przykład wyszukiwania według nazwy hosta lub identyfikatora lokalizacji.

W obu sytuacjach pole ClassDiscriminator jest umieszczane w tabelach podtypów w celu użycia z ograniczeniem CHECK do kontrolowania, które typy można wstawić.

Czy są jakieś zalecenia, dla których projekt jest lepszy, czy też jest to całkowicie kwestia opinii i zależy od zamierzonego celu bazy danych?

EDYCJA: Szczególne pytanie, które mam, dotyczy nakładającego się charakteru tabeli „NetworkDevice”. Ta tabela służy do przechowywania informacji o sieci dla dowolnego urządzenia z nazwą hosta i / lub adresem IP, niezależnie od tego, czy jest to komputer, przełącznik czy router. Czy nakładający się charakter tej tabeli może powodować problemy, czy też jest w porządku, aby zaimplementować ją w ten sposób?

Z góry dziękuję za wszelkie przekazane informacje. Zapytaj, czy potrzebne są dodatkowe informacje.

TheSecretSquad
źródło
Zobacz dba.stackexchange.com/questions/15199/ ... podobne pytanie, na które udzielono odpowiedzi
Stephen Senkomago Musoke

Odpowiedzi:

15

Fizyczna implementacja podtypów w bazie danych jest złożonym problemem. Chyba że masz sytuację, w której oferuje on istotne zalety (patrz jeden lub dwa przykłady poniżej), zwiększa złożoność implementacji, a jednocześnie zapewnia stosunkowo niewielką wartość.

Po zrobieniu tego z bardzo złożonym podzbiorem (wnioski i wyroki w systemie zarządzania sprawami sądowymi, rozbieżne struktury umów ubezpieczenia komercyjnego o połączonym ryzyku), wydaje mi się, że mam na ten temat pewne spostrzeżenia. Niektóre znaczące przypadki narożne to:

  • Jeśli całkowita liczba pól bazy danych w podtypach jest stosunkowo niska (powiedzmy: mniej niż 100) lub istnieje znaczna podobieństwo między podtypami, wówczas podział podtypów na osobne tabele fizyczne ma prawdopodobnie niewielką wartość. Spowoduje to znaczny narzut związany z raportowaniem zapytań i wyszukiwań. W większości przypadków najlepiej jest mieć jedną tabelę i zarządzać podtypami w aplikacji. (Prawdopodobnie najbliżej twojego problemu)

  • Jeśli podtyp jest bardzo rozłączny, a różne podtypy mają zwisające z nimi struktury danych zależne od typu (tj. Tabele potomne lub bardziej złożone struktury), wówczas tabele podtypów mają sens. W takim przypadku każdy podtyp prawdopodobnie ma stosunkowo niewielką podobieństwo w aplikacji (tzn. Prawdopodobnie w aplikacji jest cały podsystem dedykowany temu podtypowi). Większość raportów i zapytań prawdopodobnie wystąpi w ramach danego podtypu, przy czym zapytania krzyżowe ograniczają się głównie do kilku wspólnych pól. (System zarządzania sprawami sądowymi)

  • Jeśli masz dużą liczbę podtypów o odmiennych atrybutach i / lub wymogu skonfigurowania tej konfiguracji, bardziej odpowiednia może być ogólna struktura i dodatkowe metadane. Zobacz ten wpis SO w celu podsumowania niektórych możliwych podejść. (System zarządzania polisami ubezpieczeniowymi)

  • Jeśli masz bardzo dużą liczbę pól o małej podobieństwa między podtypami i niewielkim wymogiem wykonywania zapytań w tabelach podtypów (tj. Nic w rodzaju wielostronnych połączeń zewnętrznych względem tabel podtypów), to pod- tabele typów mogą pomóc w zarządzaniu rozrostem kolumn. (Patologicznie złożona wersja twojego problemu)

  • Niektórzy twórcy map O / R mogą obsługiwać tylko określone podejście do zarządzania podklasami.

W większości przypadków fizyczne tabele podtypów w schemacie bazy danych są nieco rozwiązaniem w poszukiwaniu problemu, ponieważ potencjalnie mają niepożądane skutki uboczne.

W twoim przypadku zakładam, że masz stosunkowo niewielką liczbę podtypów i możliwą do zarządzania liczbę atrybutów. Twój diagram i pytanie nie wskazują na zamiar powieszenia tabel podrzędnych poza rekordami. Sugerowałbym, aby rozważyć skorzystanie z pierwszej opcji sugerowanej powyżej i utrzymanie jednej tabeli i zarządzanie podtypami w aplikacji.

ConcernedOfTunbridgeWells
źródło
Dziękuję za szczegółową odpowiedź. Początkowo chciałem zachować wszystko w jednej tabeli, ale niektóre pola dla urządzeń nie mają zastosowania do innych i skończyłoby się wiązką zerowych pól. Na przykład wszystkie rekordy zapasów zawierają pola dla typu obwodu i dostawcy usług, które są specyficzne dla routerów. Wszystkie rekordy miałyby również pole numeru telefonu, które nie ma sensu, chyba że urządzeniem jest telefon. Wszelkie sugestie, jak sobie z tym poradzić?
TheSecretSquad
2
@reallythecrash - Narzut dla zerowalnych pól wynosi około jednego bajtu na pole, więc pod względem wykorzystania zasobów jest o wiele mniej narzutu niż łączenie z tabelami podklas. Naprawdę jedyną wadą jest to, że tabela będzie wyglądać nieco niechlujnie z dużą ilością zer.
ConcernedOfTunbridgeWells
3
@reallythecrash - Jeśli naprawdę chcesz (a Twój DBMS to obsługuje - nie określiłeś, czego używasz), możesz skonfigurować ograniczenia sprawdzania w oparciu o dyskryminator typu, który wymusza zerowe / nie-zerowe w polach odpowiednich dla klasa.
ConcernedOfTunbridgeWells
3

Rozważ najpierw opracowanie solidnego logicznego modelu danych przy użyciu reguł hierarchii klasyfikacji modelowania danych zawartych w książce David Model Hay. Podczas tworzenia hierarchii klasyfikacji każde wystąpienie (wiersz) musi być jednego i tylko jednego podtypu. Oznacza to, że podtypy wykluczają się wzajemnie. Klasyfikacja musi opierać się na jednej, fundamentalnej, niezmiennej charakterystyce. Korzystanie z tej podstawowej zasady zapewni modelowi dużą przejrzystość. W posiadanym modelu jedyną cechą, na podstawie której można dokonać klasyfikacji, jest przeznaczenie urządzenia - telefon, przełącznik sieciowy, komputer, router itp. Każde urządzenie musi być jednego i tylko jednego z tych typów. Na przykład lokalizacja nie byłaby podtypem. Atrybuty takie jak adres IP należą do typu super.

Myślę, że przekonasz się, że liczba typów urządzeń będzie wystarczająco duża, aby uzasadnić wzorzec EAV, jak wspomniano w innej odpowiedzi. Odnosząca się do mnie książka Davida Haya bardzo skutecznie omawia ten wzór. Jeśli jednak liczba podtypów jest niewielka, można zastosować ogólną regułę przy podejmowaniu decyzji o wdrożeniu tylko tabeli supertypowej z wieloma zerowalnymi kolumnami, tylko tabel podtypowych ze zduplikowanymi kolumnami lub obu. Jeśli każdy podtyp różni się znacznie pod względem atrybutów i nie ma żadnych relacji na poziomie supertypu, możesz użyć tylko tabel podtypu. Jeśli prawda jest odwrotna, możesz użyć tylko tabel supertypowych. Jeśli jest mieszanka, to zaimplementuj oba.

Zauważ wreszcie, że zawsze możesz zaimplementować wzorzec EAV jako schemat tabeli bazowej, a następnie utworzyć warstwę abstrakcji widoku, która przedstawia dane aplikacji jako tabele super i podtypów. Daje to elastyczność w warstwie pamięci, ale zrozumiałość w warstwie widoku aplikacji.

Todd Everett
źródło
Dzięki za informację Todd. Jedno z moich pytań dotyczy tabeli „Urządzenie sieciowe”. Ta tabela ma przechowywać rekordy dla dowolnego urządzenia, które ma nazwę hosta i adres IP. Oznacza to, że wszystkie przełączniki, komputery i routery miałyby dane związane z siecią przechowywane w tej tabeli. Z tego, co czytałem, nazywa się to nakładającym się podtypem, w którym tabela podtypów zawiera powiązane dane dla więcej niż jednego typu. Czy wiesz, czy jest to coś, czego należy unikać, czy też wszystko w porządku?
TheSecretSquad
Todd, odnosząc się do Twojego stwierdzenia „utwórz warstwę abstrakcji widoku, która przedstawia dane aplikacji ...”. To brzmi jak świetny pomysł. Myślałem o użyciu widoków dokładnie tak, jak to opisałeś, ale miałem kilka pytań na ten temat. Wiem, że można używać widoków do tworzenia zapytań i wyświetlania danych w mojej aplikacji, ale czy powszechną praktyką jest używanie widoków do wstawiania i aktualizacji? Wiem, że istnieją pewne ograniczenia dotyczące struktury zapytań (brak kolejności według klauzuli itp.), Aby wstawiać / aktualizować za pomocą widoku. Jeśli zapytanie ma prawidłową strukturę, czy zaleca się korzystanie z widoku do wstawiania i aktualizacji?
TheSecretSquad
Z mojego doświadczenia pokrywające się podtypy mylą rzeczy na poziomie logicznym, dlatego zalecałem najpierw powrót do opracowania pełnego modelu logicznego. Możesz użyć LDM do wyjaśnienia zakresu i zrozumienia przed przystąpieniem do przechowywania. W prezentowanym modelu istnieje pewne zamieszanie w zrozumieniu między podstawową naturą rzeczy - urządzeniem - a miejscem, w którym to urządzenie żyje w przestrzeni. Wyjaśnij to w LDM. Unikaj również nakładających się podtypów w fizycznej bazie danych, chyba że używasz go do pionowego podziału kolumn, w którym to przypadku w ogóle nie pisze.
Todd Everett,
Jeśli chodzi o warstwę abstrakcji, możesz użyć wyzwalacza „zamiast”, aby umożliwić aktualizację widoku. Ograniczenia, o których wspominasz (bez kolejności według) są ograniczeniami w samym widoku SQL, a nie w jego użyciu. W przypadku wstawiania / aktualizacji i tak nie ma zamawiania. Inne opcje to napisanie modułu do obsługi szczegółów wstawiania / aktualizacji lub napisanie procedury składowanej do obsługi tego. Nie widzę problemu z użyciem żadnej z tych metod, ponieważ wydajność jest akceptowalna. W przypadku typu singleton powinno być dobrze. Problemem mogą być masowe aktualizacje.
Todd Everett,
2

Produkt nie jest zapasem. Zapasy i produkty są różne.

Produkt jest tak naprawdę specyfikacją produktu, a nie rzeczą fizyczną.

Fizyczną rzeczą jest Zasób, który firma posiada (lub przechowuje). Możesz mieć zasoby, które śledzisz według numeru seryjnego (aktywa dyskretne) lub zasoby, które śledzisz tylko według ilości (zasoby magazynowe).

Chciałbym spojrzeć na książkę danych modelu danych Silverstona, tom 1. Ma dobry schemat dumy, funkcje, ceny, zapasy. Zaoszczędzi ci dużo czasu.

Neil McGuigan
źródło
1
+1 punkt za wzmiankę o książce zasobów modelu danych Silverstona. Spojrzał i było oświecające. Nie mogę się doczekać, aby przeczytać bardziej szczegółowo, jak myślę, że każdy, kto ma pytania dotyczące modelowania danych powinien. Dzięki.
TheSecretSquad
0

Jedno z pytań, które zadałbym, to dlaczego śledzisz różne atrybuty swoich przedmiotów w ekwipunku? - A dokładniej, co robisz z tymi informacjami o atrybutach?

Jeśli masz wiele raportów lub formularzy, które określają konkretne atrybuty, musisz zastosować podejście zalecane przez ConcernedOfTunbridgeWell. Z drugiej strony, jeśli te atrybuty są rejestrowane w celu ich wyszczególnienia lub porównania z podobnymi atrybutami podobnych urządzeń, wtedy możesz mieć (rzadką) dobrą wymówkę, aby używać EAV. Wiem, że „EAV jest czystym złem” z wielu powodów, z wyjątkiem bardzo rzadkich przypadków, gdy przyczyny te nie mają znaczenia dla konkretnego zastosowania. Twoja może być taka aplikacja.

Spójrz na tę odpowiedź dotyczącą projektu systemu inwentaryzacji urządzeń i tę odpowiedź dotyczącą projektu systemu katalogu produktów, aby zobaczyć, w jaki sposób podejście EAV może uprościć twoją aplikację wraz z dyskusją na temat dokładnie ryzyka EAV i jak ocenić, czy ryzyko to może nie dotyczyć konkretnego wniosku.

Joel Brown
źródło
Dziękuję za Twój wkład. Zastanawiałem się nad EAV, ale pomyślałem, że mogę osiągnąć wystarczająco dobry model bez konieczności uciekania się do złożoności związanej z EAV.
TheSecretSquad