Mam byt, który nie może istnieć bez zdefiniowania go przez inny, i chcę, aby ten byt uczestniczył w relacji wiele do wielu.
Przykład: artysta ma album (album nie może istnieć bez artysty), album ma także wiele utworów, ale ten sam utwór może istnieć w wielu albumach.
Mamy więc relację wiele do wielu między albumem a utworami.
Jeśli album jest słabym podmiotem, to jego klucz podstawowy jest kluczem obcym odnoszącym się do artysty, a zatem nie może być kluczem obcym do innej tabeli reprezentującej relację wiele do wielu.
Pytanie brzmi: czy możliwe jest posiadanie tego rodzaju relacji w SQL, a jeśli tak, to jak to wyrazić?
database-design
foreign-key
referential-integrity
Raiden Freeman
źródło
źródło
artist_id
klucz obcy, który odwołuje się do wykonawcy. Jeśli chcesz zmapować pojedynczy utwór do wielu albumów, użyj tabeli mapowania za pomocątrack_id, album_id
. Łatwo :)Odpowiedzi:
Myślę, że możesz, korzystając ze schematu relacji „diament”:
źródło
(albumID, trackNo)
i dodam również inne ograniczenie Unikalne.Niestety nie mam wystarczającej liczby przedstawicieli, aby skomentować odpowiedź ypercubeᵀᴹ , więc zamiast tego opublikuję alternatywną odpowiedź - zgadzam się z tą odpowiedzią w ogóle, ale uważam, że główny klucz i unikalne ograniczenia
AlbumTrack
są nieprawidłowe, biorąc pod uwagę, że zarówno albumy, jak i utwory są słabe podmioty. Na przykład następujące prawidłowe dane, z określonymi ograniczeniami, zostałyby niedozwolone:Zamiast tego ustawiłbym
PRIMARY KEY (artistID, albumID, trackID)
i upuścił unikalne ograniczenie, w wyniku czego:Utwory są nadal ograniczone co najwyżej raz na album.
Ponadto pytanie nie określa, że ścieżki są słabymi elementami (tylko albumy) - jeśli ścieżki faktycznie mogą istnieć niezależnie od wykonawców, tabele
Track
iAlbumTrack
są zdefiniowane nieco inaczej:źródło