połączenie (relacje) 2 odrębnych tabel do 1 tab. MSSQL

0

Cześć, na studiach dostaliśmy zadanie unormować tabelę z danymi do 3 postaci normalnej. Rozdzieliłem dane na poszczególne tabele - zgodnie ze schematem - załącznik, ale czuję, że obszar oznaczony na żółto powinien wyglądać inaczej. Generalnie w tym miejscu chodzi o to, że nagrodę Nobla może zdobyć zarówno instytucja jak i osoba fizyczna, ale zgodnie z 3NF nie powinni być w tej samej tabeli. Chciałem utworzyć osobną tabelę gdzie będą się łączyć i dodatkowo "rozróżniać" je za pomocą Nobel.TypNoblisty.

To mój pierwszy projekt tego typu, więc z góry dzięki za konstruktywne uwagi. Będę wdzięczny również za spojrzenie na relacje oraz reguły usuwania i modyfikacji.

1

Szczerze nie pamiętam tych studenckich "wymagań" więc napiszę Ci jak ja bym to zbudował jako osoba pracująca z bazami od lat.

Ogólnie nie jest źle jednak w tabeli Nobel.Noblista dodałbym dwa FK jeden do Swiat.Osoba.ID drugi do Swiat.Instytucja.ID. W takim podejściu tabela Nobel.TypNoblisty nie jest potrzebna. Ewentualnie możesz to rozbić na dwie tabele Nobel.NoblistaOsoba Nobel.NoblistaInstytucja oba podejścia mają kilka minusów i kilka plusów. Pierwsze podejści z dwoma FK pozwoli Ci na łatwiejsze pisanie selectów (bez potrzeby odwoływania się do dwóch tabel) i pozwoli ci założyć constraint, że jeśli jest już IDInstytucji to nie można wpisać IDOsoby i na odwrót. Dwie tabele mają większy poziom separacji ale trzeba pamiętać, że jak będziesz chciał wyszukać wszystkich noblistów z np 2004 roku to trzeba będzie szukać w dwóch tabelach :)

0
woolfik napisał(a):

Szczerze nie pamiętam tych studenckich "wymagań" więc napiszę Ci jak ja bym to zbudował jako osoba pracująca z bazami od lat.

Ogólnie nie jest źle jednak w tabeli Nobel.Noblista dodałbym dwa FK jeden do Swiat.Osoba.ID drugi do Swiat.Instytucja.ID. W takim podejściu tabela Nobel.TypNoblisty nie jest potrzebna. Pierwsze podejści z dwoma FK pozwoli Ci na łatwiejsze pisanie selectów (bez potrzeby odwoływania się do dwóch tabel) i pozwoli ci założyć constraint, że jeśli jest już IDInstytucji to nie można wpisać IDOsoby i na odwrót.

Z tym TypemNoblisty nie byłbym taki pewien. Wyobrażam sobie, że za 30lat jakiś Android może wygrać...i ja już będę na to przygotowany ;)
Ok rozumiem, że zamiast LaureatId zrobić 2 FK. Głupie pytanie, ale nie mogę znaleźć, a raczej nie wiem jak sformułować pytanie do google:

  1. Jak ustawić contraint w takim przypadku, mógłbyś podesłać przykład?
woolfik napisał(a):

Ewentualnie możesz to rozbić na dwie tabele Nobel.NoblistaOsoba Nobel.NoblistaInstytucja oba podejścia mają kilka minusów i kilka plusów.Dwie tabele mają większy poziom separacji ale trzeba pamiętać, że jak będziesz chciał wyszukać wszystkich noblistów z np 2004 roku to trzeba będzie szukać w dwóch tabelach :)

  1. w jaki sposób w przypadku 2 tabel Nobel.NoblistaOsoba oraz Nobel.NoblistaInstytucja połaczyć to z Nobel.Nagroda? Rozumiem, że tutaj również usuwamy tabelę Nobel.TypNoblisty.

1 użytkowników online, w tym zalogowanych: 0, gości: 1