2010-08-06 9 views
1

J'ai une conception de base de données qui est assez bien normalisée, mais maintenant j'ai besoin d'ajouter une nouvelle table (entité, puisque j'utilise réellement des données de base) et je cours dans problèmes.Problème de conception de base de données - maintien des relations au minimum

paysage a beaucoup d'évaluation
évaluation a un AssessmentType
AssessmentTree a une évaluation
AssessmentTree a un chacun des 12 autres entités, omis pour l'espace.

Maintenant, j'ajoute une entité Photo, qui peut être associée à N'IMPORTE QUELLE des entités ci-dessus. J'ai besoin d'avoir une sorte de relation en place de telle sorte que je puisse saisir uniquement les Photos liées à un AssessmentTree, par exemple, ou peut-être une Évaluation, qui serait un surensemble de Photos liées à un AssessmentTree.

(je sens que je ne peux pas avoir fait un excellent travail pour expliquer la situation alors laissez-moi savoir si je peux clarifier une certaine façon.)

solutions possibles que j'ai pris en compte, dont aucun ne satisfaisant:

  1. Créer des références à tous les autres objets à partir de l'entité Photo. Aucune référence signifierait alors que la photo ne faisait pas partie de cet ensemble.
  2. Créez une nouvelle entité, PhotoRelations, qui contiendrait une référence à la photo et une référence à l'un des objets auxquels elle est attachée. Le problème est que bien que je puisse facilement faire cela avec un système SQL, je ne peux pas penser à la façon de le traduire en CoreData.

Toute aide serait appréciée!

Répondre

2

La façon dont les données de base sont conçues pour gérer ce problème passe par l'héritage des entités.

En théorie, vous traiteriez cela comme vous le feriez avec des objets Data non Core définis avec des sous-classes. Vous devez définir une entité parent abstraite qui est liée à une entité photo concrète. Alors vous auriez toutes les entités qui ont besoin d'une photo héritée de cette entité parent. Cependant, en raison d'un détail d'implémentation avec les magasins SQL, toutes les entités enfant d'une entité parente dans un graphique se retrouvent dans la même table SQL sur le disque. Cela peut dégrader les performances d'extraction car toutes les instances de toutes les sous-entités stockées dans une table doivent être recherchées même si vous ne récupérez qu'une seule entité.

C'est une douleur.Je continue d'espérer qu'ils réfracteront cette limitation.

Vous pouvez tester l'héritage d'entité avec des données de test et voir si cela pose un problème ou non pour votre implémentation particulière. Si vous n'avez que quelques milliers de sous-entités qui récupèrent des attributs simples (chaînes, nombres, dates, etc.), vous pouvez alors utiliser l'héritage d'entité sans aucune atteinte significative aux performances.

+0

J'ai implémenté ceci et cela fait surtout ce dont j'ai besoin, mais j'aimerais pouvoir associer plusieurs photos pour chaque entité, ce qui semble difficile avec cette méthode. Suggestions? –

+0

Passez à la relation photo dans le parent à un-plusieurs. Cela vous permettra d'associer un nombre arbitraire de photos à chaque instance d'une sous-entité. – TechZen

+0

Cela fonctionne magnifiquement, merci. –

0

Ce que vous pouvez faire est de créer une table de relation comme ceci:

linkedId | photoId | LinkType

LinkType peut être l'un des énumérés ci-dessus comme un entier 1-N

+0

Cela ne semble pas différent de ma deuxième idée, et nécessite d'ajouter un champ id à chaque autre entité, ainsi qu'un tas de code supplémentaire pour garder une trace de ces identifiants. –

2

Depuis Photo est un enfant alors j'aller avec votre première option et de créer un lien vers chaque entité.

Cependant, que prévoyez-vous de stocker dans Photo? Si c'est juste les données binaires alors je le reconsidérerais et stockerais un chemin de fichier à l'image sur le disque à la place. Stocker des données binaires dans des données de base est loin d'être idéal. Ensuite, si vous arrivez à simplement stocker le chemin du fichier, vous pouvez passer complètement l'entité et stocker simplement le chemin de fichier dans le (s) objet (s) parent.

Questions connexes