2011-11-11 5 views
0

Je cherchais à porter un petit projet de côté pour utiliser Mongo, car il prenait de plus en plus de temps en utilisant Nhibernate pour le scénario actuel.MongoDb C# Support du pilote Références cycliques?

J'ai essayé NoRM à l'origine, avec une branche supportant les références cycliques et fonctionnant correctement, mais je ne trouve aucune documentation pour indiquer si le pilote C# officiel le supporte. La situation et pourquoi j'ai une référence cyclique est parce que j'ai un objet de localisation, qui contient une liste de routes, chaque route a un lien vers un autre emplacement. Il est assez similaire à un simple ensemble de nœuds dans un pathfinder.

public class Location 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public IList<Road> Roads { get; set; } 
} 

public class Road 
{ 
    public Location From { get; set; } 
    public Location To { get; set; } 
} 

Maintenant, le problème est que j'ai tout un monde construit sur ces objets (ils ont plus de propriétés dans le scénario réel) et ils ont tous Interlink, sans toutefois être en mesure de gérer des références cycliques Je ne sais pas comment Je peux résoudre ce problème, car chaque route doit connaître un point de départ et un point final.

Je sais qu'un compromis consiste à simplement se débarrasser de l'objet d'emplacement, et à la place avoir un ID qui référence l'emplacement, mais alors je dois interroger chaque sous-emplacement individuellement. Ceci est fait une seule fois et ensuite conservé en mémoire car il y a une carte énorme qui contient tous les emplacements possibles et toutes les routes possibles afin que les chemins rapides puissent être trouvés entre les points.

Il est peut-être un cas de l'emplacement et les routes ne conviennent pas à une approche de stockage de documents et peut être stocké d'une autre manière ...

Répondre

1

Le pilote officiel C# ne supporte pas vraiment « références » du tout. La valeur d'un champ peut être un ObjectID, mais le concept de jointures ou de références n'est pas réellement implémenté dans le pilote C# officiel.

Bien sûr, même avec le support "référence", ces pilotes continueraient à exécuter plusieurs requêtes.

Il est peut-être un cas de l'emplacement et les routes ne sont pas adaptées à une approche de stockage de documents et peut être stocké d'une autre manière ...

Compte tenu des cas, vous avez parlé, je suggère regarder une base de données graphique. Il en existe plusieurs populaires, notamment Neo4J, Trinity de Microsoft, GraphDB de seses et bien d'autres.

+0

Merci pour l'info. Serait-il en train d'exécuter les multiples pilotes sur le serveur et de simplement renvoyer les résultats agrégés, ou même de déclencher des requêtes individuelles? J'ai pensé que c'était peut-être le premier, mais je n'ai aucune preuve factuelle pour cette affirmation. Le reste des objets ne sont pas cycliques et semblent parfaitement correspondre aux idéaux de stockage de documents, mais comme ce cas de la carte initiale ne peut pas être un disjoncteur, ou comme je l'ai mentionné, je stocke ce bit relationnellement et le autres bits document basé – Grofit

+0

Il devrait être côté client car il n'y a pas de commande "join" côté serveur. Jetez un oeil à la base de données de graphes, car je comprends qu'ils supportent différents supports sous-jacents, donc vous pouvez obtenir tout ce dont vous avez besoin. –

Questions connexes