Eu tenho uma entidade que não pode existir sem ser definida por outra e quero que essa entidade participe de um relacionamento muitos-para-muitos.
Exemplo: um artista tem um álbum (o álbum não pode existir sem um artista), o álbum também tem muitas faixas, mas a mesma faixa pode existir em muitos álbuns.
Portanto, temos uma relação de muitos para muitos entre o álbum e as faixas.
Se o álbum é uma entidade fraca, sua chave primária é uma chave estrangeira que faz referência ao artista, portanto, não pode ser uma chave estrangeira para outra tabela que representa um relacionamento muitos-para-muitos.
A questão é: é possível ter esse tipo de relacionamento no SQL e, se sim, como eu o expresso?
database-design
foreign-key
referential-integrity
Raiden Freeman
fonte
fonte
artist_id
chave estrangeira que faz referência ao artista. Se você deseja que uma única faixa seja mapeada para vários álbuns, use uma tabela de mapeamento comtrack_id, album_id
. Fácil :)Respostas:
Eu acho que você pode, usando um diagrama de relacionamento "diamante":
fonte
(albumID, trackNo)
e adicionar a outra restrição Exclusiva também.Infelizmente, não tenho representante suficiente para comentar a resposta do ypercubeᵀᴹ , por isso vou postar uma resposta alternativa - concordo com essa resposta em geral, mas acho que a chave primária e as restrições exclusivas
AlbumTrack
estão incorretas, uma vez que os álbuns e as faixas são fracos entidades. Por exemplo, os seguintes dados válidos seriam proibidos, com as restrições prescritas:Em vez disso, eu definiria
PRIMARY KEY (artistID, albumID, trackID)
e eliminaria a restrição exclusiva, resultando em:As faixas ainda estão limitadas a ocorrer no máximo uma vez por álbum.
Além disso, a questão não especifica que as faixas são entidades fracas (apenas os álbuns) - se as faixas podem existir independentemente dos artistas, as tabelas
Track
eAlbumTrack
são definidas de maneira um pouco diferente:fonte