2011-03-30 5 views
2

Ce problème a pu être soulevé ici auparavant, mais je ne suis pas sûr d'avoir compris la solution. Voici le problème, dans Objective-C, Core Data, pour iOS.Modélisation de base de données: pont plusieurs-à-plusieurs

Je vais modéliser une relation User-Following semblable à celle de Twitter. Un utilisateur peut en suivre plusieurs et en être suivi par plusieurs. Le texte qui suit lui-même a des attributs tels que CreateTime, dans l'attente, et le niveau - cela veut dire, je ne peux pas simplement laisser l'utilisateur a des relations bidirectionnelles comme disciple et suivi, comme:

utilisateur < < - >> Utilisateur

mais ajoutez une entité de plus, suivi de relations comme suit et suivies.

utilisateur < - >> Après < < -> Utilisateur

Voici deux questions:

  1. Est-ce la meilleure pratique?

  2. Si oui, comment écrire un [aUser valueForKeyPath: ...]; aller chercher ses disciples ou ses amis (être suivi).

Répondre

2

Est-ce la meilleure pratique?

Je ne pense pas que ce problème tombe dans la catégorie des «situations pour lesquelles une meilleure pratique a été établie», mais cela semble être une solution raisonnable.

Si oui, comment écrire un [aUser valueForKeyPath: ...]; aller chercher ses disciples ou ses amis (être suivi).

Disons que Following a une propriété follower pour la personne qui fait ce qui suit, et une propriété leader pour la personne suivie. En outre, User a une propriété leads pour les relations Following avec les personnes qui suivent un utilisateur et une propriété follows pour les relations Following avec les personnes que l'utilisateur suit. Enfin, User a également une propriété name.

Compte tenu de tout cela, pour obtenir les noms des disciples de AUSER, on pourrait dire:

NSSet * disciples = [AUSER valueForKeyPath: @ "leads.follower.name"];

et pour obtenir les noms des personnes suit AUSER:

NSSet * dirigeants = [AUSER valueForKeyPath: @ "follows.leader.name"];

Il semble un peu étrange au début que vous récupériez des jeux de ces chemins clés, car les deux dernières touches de chaque chemin sont singulières.Toutefois, étant donné que la propriété leads renvoie un ensemble d'objets Following, leads.follower renvoie un ensemble contenant les utilisateurs pour chacun de ces objets et leads.follower.name renvoie un ensemble contenant les noms des utilisateurs de ces objets.

0

J'ai trouvé un bon exemple de ce que vous essayiez d'accomplir ici, et j'ai pensé partager. Vérifiez here sous la rubrique "Relations plusieurs-à-plusieurs". Vous devriez trouver un exemple en utilisant une entité Personne et une entité FriendInfo qui décrit le modèle que vous utilisez plus en détail. Remarque: Le lien renvoie à la section "Relations et propriétés récupérées" du Guide de programmation des données de base d'Apple, qui peut ou non être accessible à ceux qui n'ont pas de compte Apple Developer, et est susceptible d'être modifiée.

Questions connexes