7
votes

Association entre deux entrées dans la table SQL

Imaginez que vous avez une table de base de données qui stocke une liste de personnes. Vous voulez établir une relation entre les peuples, c'est-à-dire une personne avec la personne j.

Je suppose dans ce cas, on a besoin d'une deuxième table pour stocker des associations de personnes. Cette table contiendrait deux champs (personne1, personne2) et chaque entrée correspond à une relation individuelle entre deux personnes.

Est-ce bon ou y a-t-il un moyen plus intelligent de le faire? Cette méthode rend l'échelle de la table d'association comme N_USERS ^ 2.


0 commentaires

3 Réponses :


6
votes

Oui, c'est vrai si vous souhaitez modéliser une relation nombreuses à plusieurs. C'est toutes les personnes peuvent avoir beaucoup d'amis.

Si vous avez une relation unique, comme toutes les personnes possèdent un boss (ou pas de patron), vous n'avez pas besoin de la table supplémentaire, vous n'avez besoin que d'une colonne bosside dans la table de la personne.


0 commentaires

0
votes

Vous voudrez peut-être aussi établir le type de reletteInture. Dans ce cas, vous utiliseriez idéalement 2 tables, types de relations et relations. La clé unique pourrait être sur les 3 champs de relations.

Relationships
  PersonId
  RelatedPersonId
  RelationshipTypeId

RelationsShipTypes
  Id
  Name


0 commentaires

11
votes

1. Pour une relation individuelle:

E.g. Tableau UserInfo (pour les informations personnelles des utilisateurs) et tableau UserCredential (pour les informations de connexion des utilisateurs). C'est le tableau divisé afin de réduire la taille d'un enregistrement. P>

Spécifiez la même clé primaire pour chaque table et créez une clé étrangère d'une (table secondaire) à une autre (tableau primaire): P >

CREATE UNIQUE INDEX IX_Friendship_Right_Left
    ON Friendship(RightUserID, LeftUserID);
CREATE UNIQUE INDEX IX_Following_Right_Left
    ON Following(RightUserID, LeftUserID);
  • (a, a): il ne faut pas être un ami de soi. Li>
  • (B, A): Pour l'amitié entre A et B, le record (A, B) suffit. Ceci est un cas du principe sèche em>. Li> ul>

    La contrainte de contrôle dans le tableau suivant n'interdit que des enregistrements tels que (A, A). (A, b) signifie un moyen b et (b, a) des moyens su suit A, ces deux enregistrements ont une signification différente de sorte que tous les deux sont nécessaires. P>

    Vous pouvez créer un index supplémentaire pour optimiser les requêtes avec le Deuxième colonne (Supposons que le PK soit en clustered Index): P>

    UserInfo(#UserID);
    UserCredential(#UserID)
        FOREIGN KEY (UserID) REFERENCES UserInfo(UserID);
    


1 commentaires

Salut. Dans votre premier code à plusieurs fois, vous dites ... "Vérifier (de gauche juste hyputeeid);". Est-ce que c'est bien que le premier est "<" et la seconde est "<>"?