J'ai une entité qui ne peut exister sans être définie par une autre, et je veux que cette entité participe à une relation plusieurs-à-plusieurs.
Exemple: un artiste a un album (l'album ne peut pas exister sans artiste), l'album contient également de nombreuses pistes, mais la même piste peut exister dans de nombreux albums.
Nous avons donc une relation plusieurs à plusieurs entre l'album et les morceaux.
Si l'album est une entité faible, sa clé primaire est une clé étrangère référençant l'artiste, il ne peut donc pas être une clé étrangère vers une autre table représentant une relation plusieurs-à-plusieurs.
La question est: est-il possible d'avoir ce type de relation en SQL, et si oui, comment l'exprimer?
database-design
foreign-key
referential-integrity
Raiden Freeman
la source
la source
artist_id
clé étrangère qui fait référence à l'artiste. Si vous souhaitez qu'une seule piste soit mappée sur plusieurs albums, utilisez une table de mappage avectrack_id, album_id
. Facile :)Réponses:
Je pense que vous pouvez, en utilisant un diagramme de relation "diamant":
la source
(albumID, trackNo)
et ajouter également l'autre contrainte Unique.Malheureusement, je n'ai pas assez de représentant pour commenter la réponse de ypercubeᵀᴹ , donc je posterai une réponse alternative à la place - je suis d'accord avec cette réponse en général, mais je pense que la clé primaire et les contraintes uniques
AlbumTrack
sont incorrectes étant donné que les albums et les pistes sont tous deux faibles entités. Par exemple, les données valides suivantes seraient, avec les contraintes prescrites, interdites:Au lieu de cela, je définirais
PRIMARY KEY (artistID, albumID, trackID)
et supprimerais la contrainte unique, ce qui entraînerait:Les morceaux sont toujours contraints de se produire au plus une fois par album.
De plus, la question ne spécifie pas réellement que les pistes sont des entités faibles (seulement que les albums le sont) - si les pistes peuvent en fait exister indépendamment des artistes, les tableaux
Track
etAlbumTrack
sont définis légèrement différemment:la source