2010-01-20 8 views
2

Je suis familier avec les bases de base de données et ai fait quelques barbotage, mais n'ai pas vraiment fait d'applications principales. Maintenant, j'ai besoin d'en planifier un. Et la question n'est pas spécifiquement sur les données de base, mais plutôt sur la conception de données en général, bien que je vais utiliser Core Data pour l'implémenter sur iPhone, ce qui est important pour prendre en compte les performances. Imaginez que je crée une application de courrier électronique, où les courriels sont l'objet de base. Je dois fournir plusieurs vues dans le magasin de courrier électronique: recherche par utilisateur ainsi que de nombreux autres critères: disons «tous les emails avec plus de deux destinataires», «tous les emails dont le sujet est plus long que X», "Conception de modèle de base de données - recherche vs relations?

Certains objets, comme les personnes (expéditeurs/destinataires), se prêtent naturellement à être modélisés comme des objets de première classe, ce qui me permet de créer des relations plusieurs-à-plusieurs entre les personnes et les courriels. D'autres recherches, comme certains exemples ci-dessus, sont plus artificielles et il n'y a aucun moyen naturel de les modéliser. Cependant, je suis en mesure d'énumérer les nouvelles recherches à l'avance, je sais à l'avance quels seront les critères.

Donc, pour faire des choses comme « e-mails avec> 2 destinataires » et « e-mails dont le sujet est plus que X », je pense avoir deux stratégies:

modèle

1) ceux-ci comme un objet spécial « recherche » et créez des relations plusieurs-à-plusieurs entre les e-mails et les objets de recherche lors de l'insertion de nouveaux objets dans le magasin. Il s'agit donc d'une simple requête de jointure lors de la recherche. 2) ne pas modéliser quoi que ce soit au-delà de l'objet e-mail principal et effectuer des recherches avec des prédicats du magasin lors de l'exécution.

Ma question est:

basé sur vos instincts de base de données, quelle est la différence entre ces deux stratégies dans une perspective de performance? Mon instinct me dit que # 1 sera toujours plus rapide, mais si c'est 10%, je suis prêt à prendre le coup de performance afin d'être plus flexible aveC# 2. Mais si le # 2 est 200% plus lent, je dois mettre plus de travail dans la modélisation de l'objet de recherche et essentiellement pré-générer tous les résultats de la recherche. Je sais que la réponse exacte dépendra des spécificités des données, mais il doit y avoir une intuition que vous avez :) Disons qu'il y a de l'ordre de dizaines de milliers, mais pas de millions, d'objets de contenu, et chaque enregistrement est quelques paragraphes de texte de contenu avec plusieurs champs de métadonnées.

Répondre

2

En règle générale, je recommande d'aller avec la stratégie deux et ne passer du temps à rechercher et développer d'autres techniques si vous rencontrez des problèmes de performance lors des tests. Les données de base sont souvent plus rapides que les gens pensent surtout sur l'iPhone. Toutefois, si vous êtes en mesure de déterminer toutes les recherches possibles à l'avance, cela vous donne un avantage. Il semble que lorsqu'un email est créé, vous le vérifieriez et l'ajouteriez à tous les objets de "recherche" appropriés. Mon intuition est que cette stratégie serait beaucoup plus rapide, surtout pour des dizaines de milliers d'objets email.

+1

Je suis d'accord avec gerry3 et j'ajouterais que vous pouvez ajouter les recherches pendant le développement une fois que vous avez le modèle de données en place et que vous pouvez le tester pour la performance. Vous pouvez créer une base de données "test" avec un volume de données supérieur à celui que vous attendez de l'application, puis tester par rapport à cela pour révéler les problèmes de performances. –

Questions connexes