2011-06-04 3 views
0

J'envisage d'utiliser des données de base pour une application que j'écris. Cependant, après avoir lu les documents, je ne sais pas comment modéliser une relation particulière. Voici les bases:Données de base: To-Many relation et modèle

J'ai une entité appelée "ProjectFile" qui a quelques propriétés de base de la chaîne. (L'un d'eux est un chemin vers un fichier sur le disque - appelez le "Fichier X" - que mon application va manipuler.) Cependant, lorsque l'application manipule le fichier X, elle peut aussi avoir besoin de manipuler d'autres fichiers - - fileY et fileZ. FileY et FileZ, comme fileX, seront des entités "ProjectFile". J'ai donc besoin d'un moyen de dire à Core Data "FileY et FileZ sont associés à FileX". Pour ce faire, j'ai créé une relation sur l'entité "ProjectFile" appelée "linkedFiles" et définir la destination à "ProjectFile" et l'inverse de "linkedFiles". Je l'ai ensuite défini comme une relation "à plusieurs", car chaque "ProjectFile" peut avoir plusieurs fichiers liés.

Cela semble récursif pour moi et je ne suis pas sûr que je l'ai fait correctement. Les fichiers "liés" (fileY et fileZ) doivent exister par eux-mêmes, tout comme le fait fileX. Je dois être capable de les "supprimer" de la relation "linkedFiles" mais les avoir toujours séparément, si cela a du sens. Essentiellement, j'ai juste besoin d'une relation faible entre des objets séparés dans mon modèle.

Est-ce que je l'ai fait correctement, ou ai-je oublié quelque chose? Merci!

Répondre

0

Donc, vous avez un modèle de données qui ressemble à ceci:

ProjectFile{ 
    path:string 
    infile<<-->>ProjectFile.infile 
} 

Cela fonctionne parce que (1) les relations de base de données ont directionnalité/cardinalité et (2) chaque objet est unique. Où vous pouvez avoir des ennuis est avec des règles de suppression. Vous avez à peu près utiliser No Action ou Nullify dans cette circonstance ou risquer de déclencher une suppression en cascade. Cela risque à son tour de créer des objets orphaned qui n'ont aucune relation et qui sont difficiles à trouver et à supprimer dans le graphe d'objets.

Un meilleur modèle encoderait plus d'informations dans les relations elles-mêmes. Il semble que les objets de fichiers du monde réel que vous modélisez ont deux relations distinctes avec les autres objets de fichier: (1) Chaque instance a d'autres instances qu'elle manipule et (2) chaque instance a d'autres instances qui la manipulent. Ainsi, votre modèle doit refléter le fait que:

ProjectFile{ 
    path:string 
    toManipulateFiles<<-(nullify)->>ProjectFile.manipulatedByFiles 
    manipulatedByFiles<<-(nullify)->>ProjectFile.toManipulateFiles 
} 

Cela rend la relation de type explicite entre les objets et vous permet d'obtenir rapidement et facilement les objets pour chaque opération particulière. Vous pouvez utiliser Nullify sur une relation sans perdre l'objet de l'autre.

Bien que cela ne soit pas immédiatement évident, les relations ne sont pas simplement des lignes sur un modèle graphique, ce sont des objets réels qui peuvent contenir beaucoup d'informations. Vous devez concevoir dans cet esprit.

Questions connexes