2010-10-04 29 views
7

Jestem całkiem nowy w projektowaniu baz danych, ale rozumiem podstawy. Tworzę relacyjną bazę danych i chciałbym zrobić coś podobnego do tworzenia typu lub klasy wielokrotnego użytku. Na przykład załóżmy, że mam tabelę Customer i tabelę . Klient i produkt są powiązane standardową relacją 1-do-wielu, więc pozycja ma kolumnę o nazwie CustomerId.Jak modelować niestandardowy typ w relacyjnej bazie danych?

Chciałbym również mieć wiele "notatek" dla każdego klienta: i dla każdej pozycji. W normalnym modelu OOP po prostu utworzyłem klasę Note i tworzyłem jej instancje, kiedy tylko było to potrzebne. Oczywiście relacyjna baza danych jest inna. Zastanawiałem się nad tabelą Note i chciałbym uzyskać relację jeden do wielu między Klientem a Notatką, a także Przedmiot i Uwaga. Problem polega na tym, że tabela uwag będzie musiała mieć kolumnę dla każdej innej tabeli, która chce użyć tego "typu". (zobacz przykład poniżej) note_relation1

Pomyślałem także, że zamiast tego mogę utworzyć stół pośredni między Notatką a Klientem/Przedmiotem (lub innymi). Pozwoli mi to uniknąć dodawania dodatkowych kolumn w Note dla każdej tabeli, która się do niej odwołuje, więc notatka może pozostać niezmieniona, ponieważ dodaję więcej tabel wymagających notatek. Myślę, że to jest lepsze rozwiązanie. (patrz przykład) note_relation2

Jak zazwyczaj radzi sobie z taką sytuacją? Czy jestem blisko, aby poprawić? Byłbym wdzięczny za wszelkie porady dotyczące projektowania mojej bazy danych w taki sposób, jaki opisałem powyżej.

+0

Pytanie: Czy kiedykolwiek uwaga stosuje się do wielu podmiotów; to jest może ta sama uwaga dotyczy zarówno klienta, jak i przedmiotu? Czy ta sama uwaga może dotyczyć wielu klientów lub wielu przedmiotów? –

+0

Nie, każda notatka byłaby tylko dla jednego klienta, przedmiotu lub cokolwiek innego. –

+0

Nic w projekcie bazy danych nie wyklucza tego. Powinieneś przenieść pola TEKST i DATA z UWAGA do CustomerNote i ItemNote, aby odpowiednio odwzorować, że każda uwaga może być powiązana z najwyżej jednym Klientem lub Przedmiotem. W rezultacie tabela NOTE zostanie całkowicie wyeliminowana. –

Odpowiedz

4

Tak, Twój końcowy przykład jest poprawny i powinien być właściwą drogą.

Modelujesz "typ złożony" w relacyjnych bazach danych, tworząc tabele. Możesz uznać tabelę za klasę: w rzeczywistości rozwiązania ORM często mapują klasę bezpośrednio do tabeli. Instancja typu niestandardowego jest wierszem w jej tabeli, a instancji można się odwoływać do wartości klucza podstawowego.

można używać zwyczaj „kompleks typu” dla pól w innych tabel za pomocą tego samego typu danych jako klucza podstawowego „typu złożonego” i egzekwowania relacji z foreign key constraint:

Zbudujmy kompleks typu dla „krajów”:

CREATE TABLE countries (
    iso_code  char(2)  NOT NULL,  
    name   varchar(100) NOT NULL, 
    population bigint  
    PRIMARY KEY (iso_code) 
); 

I dodajmy kilka przypadków „krajów”:

INSERT INTO countries VALUES ('IE', 'Republic of Ireland', 4470700); 
INSERT INTO countries VALUES ('US', 'United States of America', 310403000); 

teraz mamy zamiar korzystania z naszych kompleks „kraje” typ w tabeli „users”:

CREATE TABLE users (
    id   int   NOT NULL, -- primitive type 
    name  varchar(50) NOT NULL, -- primitive type 
    age   int,      -- primitive type 
    country  char(2),     -- complex type 
    PRIMARY KEY (id), 
    FOREIGN KEY (country) REFERENCES countries (iso_code) 
); 

Z powyższego modelu, mamy zagwarantowane, że pole tabeli userscountry może być tylko ważny kraj, i nic ale ważnego kraju .

Ponadto, zgodnie z sugestią, używanie junction table jest również odpowiednim podejściem do radzenia sobie z takim rodzajem polymorphic relationship. Możesz być zainteresowany w sprawdzeniu następujące posty przepełnienie stosu jakiegoś dalszego czytania na ten temat:

+0

hmm, Przypuszczam, że gdy utworzę tabelę skrzyżowań, taką jak "CustomerNote", mogę modelować to jako relację dziedziczenia w ORM (czytałem, że jest to wielostolikowy sposób dziedziczenia - w rzeczywistości już zaprojektowałem moja tabela "Klient", aby być pod-klasą innej tabeli "Kontakt"). Mimo że moim celem nie było tworzenie dziedzictwa dla notatek, w zasadzie tworzę podklasy notatek (CustomerNote ...) dla każdej tabeli, którą chcę odnieść do "Notatek" (np. Klient i Przedmiot). Kiedy modeluję to w ORM, byłoby lepiej utworzyć tylko pojedynczą klasę "Note" lub modelować dziedziczenie? –

+0

@Benny: To interesujące pytanie, ale myślę, że odpowiedź zależy od rozwiązania ORM. Niestety nie mam dużego doświadczenia w korzystaniu z ORM, aby dodać więcej informacji. –

0

Myślę, że najlepiej można dodać pole Note do tabeli Customer i tabeli Item. W polu uwagi (klucz obcy) można zapisać identyfikator noty, która należy do klienta/przedmiotu. Aby upewnić się, że możesz załączyć wiele notatek do klienta lub przedmiotu, możesz dodać tabelę Notes i dołączyć pojedyncze uwagi do tabeli "Notatki", którą możesz dołączyć do swojej tabeli Klient/przedmiot.

Powiązane problemy