2009-09-19 17 views
5

Mam 4 podklasy: Video, Image, Note i Form. Każdy zawiera różne typy danych. Na przykład klasa Image zawiera ścieżkę do pliku obrazu na dysku i właściwościach obrazu, a klasa Form zawiera wartości pól formularza. Wspólnym elementem pomiędzy każdej pozycji jest jednak to, współrzędne GPS i kierunku, więc mam następujący abstrakcyjna klasa podstawowa:model abstrakcyjna klasa podstawowa i podklasy w bazie danych

public abstract class Content 
{ 
    public float? Latitude { get; set; } 
    public float? Longitude { get; set; } 
    public float? Heading { get; set; } 
} 

Jednakże gdy mam mgliste jest, w jaki sposób modelować to w bazie danych. Obecnie mam tabelę o nazwie Events (dla przykładu, powiedzmy, że wydarzenie jest przyjęcie urodzinowe) i 4 tabele (Videos, Images, Notes i Forms). Każda tabela ma klucz obcy powiązany z kluczem podstawowym Events.

Używając LINQ-SQL, otrzymuję 5 klas dla każdej tabeli. To jest w porządku, jeśli chcę tylko jeden typ danych, na przykład Event.Images, ale chcę policzyć całkowitą liczbę "zawartości", jaką ma Event i uzyskać współrzędne GPS. Mogę skrzywić licznik wystarczająco łatwo, używając tylko Event.Images.Count() + Event.Videos.Count() + ..., ale nie mogę zrobić tego samego dla współrzędnych GPS. Czy istnieje sposób, w jaki mogę modelować bazę danych, aby móc używać klasy bazowej dla każdego przedmiotu i nadal móc uzyskać indywidualny, mocno napisany przedmiot, gdy potrzebuję zobaczyć jego dane?

Odpowiedz

8

Istnieją trzy różne wzory na to udokumentowane w Patterns Martina Fowlera Enterprise Application Architecture, każdy z różnych kompromisów:

+0

Dzięki za linki. Nie opisują dokładnie, jak używać modeli, ale dają mi punkt wyjścia do dalszych badań. Osobiście zawsze uważałem, że model z pojedynczą tabelą jest złym pomysłem, ponieważ oznacza to, że jeśli dodasz nową podklasę, będziesz musiał dodać nowe kolumny dla swoich danych, które mogą zawęzić się do niepożądanego rozmiaru, choć w przypadku mniejszych aplikacji widzę zalety korzystania z niego. –

+0

Ya, są określone kompromisy. To zależy od prawdopodobieństwa dodania nowych typów. Jeśli jest to mało prawdopodobne, lepiej będzie unikać przechodzenia przez wiele tabel i korzystania z pojedynczej tabeli. Jeśli prawdopodobne, jeden z innych wzorów. I, tak, te linki są dość rzadkie, ponieważ chcą, żebyś kupił książkę :-) To dobra książka - warto ją zdobyć. – SingleShot

1

Że jest jednym ze sposobów, aby to zrobić.

Ogólnie rzecz biorąc, istnieją dwa inne sposoby:

  • stół za podklasy: zamiast próbować dzielić klasy bazowej w bazie danych, wystarczy utworzyć oddzielne tabele dla każdego z nich.

  • Tabela na hierarchię: umieść nadzbiór wszystkich pól w tabeli, a także kolumnę "dyskryminującą" i umieść je w jednym miejscu.

Aby dowiedzieć się, co jest słuszne, pomyśl o wzorcach użytkowania:

  • jeśli generalnie traktować je niezależnie, a kwerenda niezależnie oddzielne tabele są dobrym sposobem na go-- albo co Cię mieć lub tabela na podklasę.
  • jeśli są one traktowane jako zbiory heterogenicznych, więc warto spojrzeć na nie jako taki, pojedyncza tabela może być łatwiejsze

zobaczyć także jakie narzędzie obsługuje najbardziej naturalnie. Wszystkie działają.

+0

Dzięki za odpowiedź. Okazuje się, że i tak muszę zmienić cały model domeny, więc mój problem naprawił się, że tak powiem. –

-2

Właściwie to dokładnie pytanie jest bardzo często zadawane i zostało answered many times. Prawdopodobnie nie wyszukiwałeś za pomocą terminologii bazy danych.

Problem polega na stosowaniu terminologii OO i myśleniu w obszarze nieobiektowym; wykonywanie zwykłego, prostego zadania jest bardzo złożone i ograniczone.

Książki Martina Fowlera i Scotta Amblera nie są warte dolara dla wielu z nich, szczegóły w this answer, począwszy od wpisu 11 grudnia 10.

+6

-1, zadałem to pytanie w dniu 2009-09-19, zanim utworzone artykuły zostały połączone. Twoja odpowiedź nie jest odpowiedzią, ale raczej cienką zawoalowaną obelgą przeciwko mnie i dwóm szanowanym osobom w branży. –

+2

@ Daniel. Ten wątek wciąż nadchodzi, na inne (bieżące) wątki, tak to znalazłem. Przepraszam, nie zauważyłem, że to było od roku 2009. Żadna obelga nie była dla ciebie. Fowler & Ambler mają wiele odpowiedzi. Cieszę się, że mogę odpowiedzieć na konkretne pytania, ale nie można reagować na ogólniki na temat Fowlera/Amblera lub na temat odczuć (np. Czym jest "zniewaga"?) – PerformanceDBA

Powiązane problemy