Comment puis-je concevoir une base de données avec une table de lecteurs (avec la clé primaire player_id) que je veux associer en deux équipes pour que la base de données puisse appliquer la contrainte l'équipe se compose de exactement deux joueurs et chaque joueur est dans au plus une équipe?Création d'une base de données pour l'appariement des contraintes
Je peux penser à deux solutions, mais les deux ne me plaisent pas.
Une possibilité est d'avoir deux colonnes player1_id et player2_id qui sont uniques clés étrangères pointant vers la player_id colonne dans la table des joueurs. Un contrôle supplémentaire est nécessaire pour qu'aucun joueur ne soit en même temps joueur1 d'une équipe et joueur2 d'une seconde équipe.
L'autre possibilité qui me vient à l'esprit est de se connecter la table des joueurs et la table d'équipe avec une table de composition de l'équipe qui a une unique, clé étrangère à la player_id colonne dans la table des joueurs et une seconde clé étrangère pointant vers la clé primaire de la table d'équipe. Ici, un contrôle doit être ajouté que chaque équipe a exactement deux membres.
Y a-t-il une meilleure conception qui simplifie la vérification des contraintes?
Si c'est important: la base de données que j'utilise est PostgreSQL 8.4 et je préfère ses puissants rule system aux triggers autant que possible.
EDIT: Une solution basée sur la réponse de AlexKuznetsov
Il ne se sent pas encore parfait pour moi, mais je l'aime beaucoup mieux que ce que j'avais avant. J'ai modifié la solution d'Alex car je ne veux pas avoir une clé étrangère des joueurs vers les équipes, car il y a une phase d'application où les joueurs peuvent s'inscrire. Cette définition s'assure que les membres d'une équipe viennent en couple (et seront insérés par paire). Maintenant, les joueurs peuvent être dans au plus une équipe et les équipes peuvent avoir exactement 0 ou exactement 2 joueurs. Pour m'assurer que chaque équipe a des membres, je pourrais ajouter une clé étrangère dans la table d'équipe qui pointe vers l'une de ses deux appartenances. Mais comme Erwin, je ne suis pas un fan de vérification de contrainte différée. Des idées comment améliorer à cet égard? Ou y a-t-il une approche complètement différente et meilleure? PS: Les méthodes fonctionnent également pour les équipes de n> 2 joueurs. Il suffit de remplacer OtherNumberInTeam par NextNumberInTeam avec la valeur (c'est-à-dire la contrainte) NumberInTeam + 1 mod n.
Avez-vous des vues matérialisées postgres? – FerranB