2009-06-29 6 views
6

Chez linkedin, lorsque vous visitez le profil de quelqu'un, vous pouvez voir comment vous êtes connecté à eux. Je crois que linkedin montre jusqu'à connexions 3ème niveau, sinon plus, quelque chose commeComment modéliser cette [Réseaux, détails dans la publication] dans la base de données pour une efficacité et une facilité d'utilisation?

shabda -> utilisateur Foo, l'utilisateur de la barre, l'utilisateur baz -> connexion de Joel -> Joel

Comment puis-je représenter cela dans la base de données.

Si je modèle comme,

 

User 
    Id PK 
    Name Char 

Connection 
    User1 FK 
    User2 FK 

ensuite de trouver le réseau, trois niveaux en profondeur, je dois obtenir toute ma connexion, leurs connexions et leurs connexions, puis voir si l'utilisateur actuel est là . Ce serait évidemment très inefficace avec DB de toute taille, et probablement maladroit pour travailler avec. Puisque, sur lié dans je peux voir ce réseau, sur n'importe quel profil que je visite, je ne pense pas que ce soit également précalculé.

L'autre chose qui me vient à l'esprit est probablement que ce n'est pas mieux stocké dans une base de données relationnelle, mais alors quelle serait la meilleure façon de le stocker et de le récupérer?

+0

Bonne question, je pense que cela va profiter à beaucoup de gens. +1 –

Répondre

5

Ma recommandation serait d'utiliser une base de données graphique. Il semble qu'il n'y ait qu'une seule implémentation actuellement disponible, et c'est Neo4j. Il est écrit en Java, mais a des liens vers Ruby et Scala (Python en cours).

Si vous ne connaissez pas Java, vous ne pourrez malheureusement pas trouver quelque chose de similaire sur une autre plate-forme (malheureusement). Cependant, si vous connaissez Java (ou êtes au moins prêt à apprendre), cela en vaut la peine. (Techniquement, vous n'avez même pas besoin d'apprendre Java à cause des bindings Ruby/Python.) Neo4j a été construit pour exactement ce que vous essayez de faire. Vous auriez beaucoup de mal à essayer de l'implémenter dans une base de données relationnelle, alors que vous seriez capable de faire exactement la même chose avec seulement quelques lignes de code Java, et beaucoup plus efficacement.

Si ce n'est pas une option, je recommanderais quand même d'examiner d'autres types de bases de données tels que object databases. Les bases de données relationnelles n'étaient pas conçues pour ce genre de choses, et vous auriez plus de mal à essayer de le faire dans un SGBDR plutôt que de passer à un autre type de base de données et de l'apprendre.

+0

Merci, c'était ce que je pensais aussi. J'ai essayé de travailler à Java, il y a quelques années, j'espère qu'ils ne se sont pas entièrement rouillés et qu'ils peuvent être utilisés à bon escient. – agiliq

+0

Pour être honnête, je n'avais jamais travaillé avec Java auparavant et j'ai trouvé Neo4j très simple. Donc tout ira bien. :) –

+1

Vous trouverez des informations sur les liaisons de langue pour Neo4j sur le wiki: http://wiki.neo4j.org/. Vous pouvez également créer une API RESTful spécifique à un domaine dans Ruby ou Scala (il y a des liens dans le wiki) si cela convient bien à votre application. – nawroth

3

Je ne vois pas pourquoi il y a quelque chose de mal à utiliser une base de données relationnelle pour cela. Les tables définies dans la question constituent un excellent début. Avec une optimisation appropriée, vous serez en mesure de garder votre performance bien en main. Personnellement, je pense que vous auriez besoin de quelque chose de sérieux pour justifier d'abandonner un produit grand public aussi polyvalent. Vous aurez probablement besoin d'un RBDMS dans le projet de toute façon et il existe une quantité incomparable de choix légitimes dans de nombreuses fourchettes de prix (même gratuites). Vous obtiendrez une documentation de qualité, une assistance sera disponible et vous disposerez d'un grand nombre de développeurs hautement qualifiés dans le pool de travaux. En ce qui concerne ce modèle d'auto-relations (utilisateurs joints à d'autres utilisateurs), je recommande d'examiner les requêtes récursives. Cela vous évitera d'effectuer une cascade de requêtes individuelles pour trouver 3 niveaux de relations. Envisagez la méthode SQL Server suivante pour effectuer des requêtes récursives avec des CTE.

http://msdn.microsoft.com/en-us/library/ms186243.aspx

Il vous permet de spécifier la profondeur que vous voulez aller avec le soupçon de MAXRECURSION.

Ensuite, vous devez commencer à réfléchir aux moyens d'optimiser.Cela commence par les meilleures pratiques standard pour configurer vos tables avec les index et la maintenance appropriés, etc. Il se termine inévitablement avec denormalization. C'est une de ces choses que vous ne faites qu'une fois que vous avez déjà essayé tout le reste, mais si vous savez ce que vous faites et utilisez de bonnes pratiques, votre gain de performance sera significatif. Il existe de nombreuses ressources sur Internet pour vous aider à en savoir plus sur la dénormalisation, juste look it up.

+1

Pourquoi? Parce que vous obtiendrez des performances extrêmement médiocres avec un SGBDR. Essayez d'aller au-delà de 3 niveaux de profondeur des relations. Cela ne peut pas arriver, sauf si vos utilisateurs sont prêts à attendre quelques secondes pour le charger (et votre serveur de base de données peut le gérer). Neo4j a été construit à partir de la base dans cet esprit, et (d'après ce que j'entends) aller 100.000 niveaux de profondeur peut être fait en quelques secondes. Un SGBDR peut-il faire cela? –

Questions connexes