2012-10-02 6 views
0

Mon équipe et moi-même sommes tous débutants avec NoSQL, portais toujours l'Entity Framework avec SQL Server 2008 sur un projet mais avec le temps le projet devenait plus grand et plus complexe que l'EF ne le fait pas résolu plus pour nous, nous avons décidé d'adopter le MongoDB, mais nous avons encore beaucoup de doutes en raison du grand changement de paradigme, je vais les poster ici pour voir ce que vous en pensez et vos opinions. J'ai les entités "Personne Fisica", "Patient" et "professionnel" et le patient et le Professionnel sont Personne, mais dans quelques instants le patient et le professionnel seront la même personne ex (un bureau de santé professionnel qui est aussi patient) dans SQL Server, nous avions un patient qui avait une référence à la personne physique et professionnelle qui avait aussi une référence à la personne. Quand patient et professionnel étaient la même personne, les deux avaient des références à la même personne, maintenant chez mongo Des doutes sont apparus, certains membres de l'équipe ici veulent faire la même chose à peu près, les patients et les organisations professionnelles ont l'Id de la Personne. Maintenant, je voulais que le patient et le professionnel aient l'objet complet Personne, mais oh, comment cela serait-il possible? Parce que techniquement la Personne Physique du Patient serait différente de la Personne Physique du Professionnel ... Ceci et d'autres questions nous brisent la tête ici, dans plusieurs entités qui sont partagées ne savent pas si nous mettons l'entité dans l'objet qui l'a ou l'objet ne prend que l'identifiant de l'entité, de la même manière que dans la base de données relationnelle. Un autre exemple: l'unité de santé et les types de UnidadeDeSaude, un type d'unité de santé a plusieurs unités de santé et une unité de santé a un type, l'approche correcte serait de placer l'objet Type d'unité dans l'unité de santé ou simplement le référencer par Id ?Comment modéliser des données avec NoSQL

googlé quelques articles, mais nous sommes encore dans le doute dans ces cas http://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/ http://blog.fiesta.cc/post/11319522700/walkthrough-mongodb-data-modeling

Répondre

1

Sans être en mesure de voir exactement ce que vous avez, si d'une manière générale, dans MongoDB vous ne rejoindrait pas les tables de De la même manière qu'avec un SGBDR. Généralement, si vous avez une entité Personne, vous stockez la Personne entière en tant que Personne. C'est un joli mappage de vos classes de code. Dans le cas où vous avez des références à d'autres entités, dites où une seule personne est partagée entre Patient et Professionnel, vous le feriez avec une référence de clé étrangère dans un SGBDR. Vous pouvez le faire avec Mongo mais Mongo ne fera pas le JOIN pour vous. Cela aurait été fait par l'appelant. L'approche recommandée consiste à mettre une copie de l'entité Personne dans Patient ET Professional. L'impact de ceci signifie que si vous mettez à jour l'entité Personne vous devez maintenant mettre à jour les données à deux endroits, mais ce n'est pas nécessairement aussi mauvais que cela puisse paraître. Il est généralement "rapide" à mettre à jour et vous pouvez mettre à jour "atomiquement" donc il n'y a pas de différence entre cela et mettre à jour une seule entité sauf que vous n'avez pas besoin de JOIN pour que vos lectures soient plus simples et plus rapides.

L'outil le plus puissant pour récupérer des données est l'index de la collection (table) sur vos documents (entités) et tout moyen de le faire sera le moyen le plus rapide de renvoyer des données. Donc, de manière intuitive, si vous avez besoin de filtrer et de traiter des parties d'un document plus souvent que vous n'en avez besoin, il est préférable de le diviser en entités partageant une clé indexée. Cela signifie stocker la personne, le patient et le professionnel dans la même collection et en utilisant deux clés. Une clé est partagée par la Personne et sa classe dérivée (Patient) et l'autre est un discriminateur de type qui sélectionne une partie ou l'autre. En d'autres termes, utilisez l'index pour rechercher des entités entières ou des collections d'entités entières. En dehors de cela, si une fois que vous avez utilisé l'index pour localiser une entité, Personne, Patient ou Professionnel, lisez toute l'entité et faites en sorte qu'elle contienne tout ce dont vous avez besoin pour répondre à la demande sans JOIN. Ainsi, que vous demandiez au patient ou à la personne (tous deux se rapportent à la même personne), vous obtenez les mêmes données de personne, quel que soit l'objet que vous lisez.En bref, vous allez répliquer des données dans Mongo à peu près partout où vous auriez utilisé une jointure dans SQL. Etes-vous capable de dessiner ce à quoi ressemble votre hiérarchie de classes?

+0

Voici un peu de mon modèle: https://gist.github.com/3823206 –

+1

OK, donc Professional et Patient ne dérivent pas de PhysicalPerson mais en contiennent un. Contrairement à ce que vous avez fait avec un ORM, dans Mongo, vous devez sérialiser le patient tel quel, y compris l'objet Person directement intégré, en supposant que vous voulez lire l'ensemble du patient en une seule opération. N'oubliez pas de faire un JOIN qui serait deux opérations. Toutefois, si vous souhaitez opérer séparément sur des objets Person, il vaut mieux les utiliser comme des entités de premier niveau distinctes dans une collection. En fait, vous pouvez faire les deux, en fonction de ce qui convient le mieux à vos requêtes. – cirrus

+0

Merci @cirrus, cela a clarifié beaucoup de choses pour moi et mon équipe! –

Questions connexes