2009-11-03 15 views
2

Bonnes nouvelles! Depuis la version 4.8 BerkeleyDB a une interface C#. BerkeleyDB est une chose très intéressante pour moi en raison de sa nature non-SQL. Je sais que c'est un excellent outil si quelqu'un veut stocker beaucoup de paires clé/valeur. Et je connais des tables "attachables". Ce que je ne sais pas, c'est comment stocker des données hiérarchiques avec BerkeleyDB. Est-ce approprié pour cela en général?Données Hierarchiques et BerkeleyDB

Qu'est-ce que je veux faire? Je veux stocker les données de dmoz.org. Maintenant j'ai tous les mille rdfs importés à MySQL DB. Mais je n'ai pas besoin de procédures stockées ou d'autres fonctionnalités complexes. Je veux utiliser BerkeleyDB comme un magasin de données pour mon lecteur RSS en ligne. Il y a donc des flux dans une arborescence de catégories (comme je l'ai dit, les catégories que j'ai importées de dmoz et j'en ai BEAUCOUP, ainsi que des flux - des millions). Et ... j'ai oublié les éléments de flux. Je veux les stocker aussi avec BerkleyDB :-).

On dirait que je dois mettre en œuvre toutes les relations manuellement ,,, C'est bon ... Mais la question la plus importante que je pose est la vitesse. Will (Can) ma solution avec BerkeleyDB sera-t-elle plus rapide que celle basée sur MySQL (ou sur n'importe quel SGBDR en général)?

Répondre

2

Il convient pour cela, mais il est peut-être plus de travail que vous êtes prêt à mettre en. BerkeleyDB est une clé très générale/magasin de valeur, donc tout ce que vous faites est à dire « pour la touche X, la valeur du magasin Y » . Plus tard, vous pouvez dire "donnez-moi la valeur de la touche X" et cela vous rendra Y. C'est vraiment tout ce qu'il fait d'un niveau élevé. Il a des caractéristiques très robustes pour garantir des propriétés de fiabilité importantes (appelées ACID, pour Atomicity, Consistency, Isolation, et Durability), et a de grandes performances, mais du point de vue du programmeur, c'est une structure de carte simple.

Alors oui, vous pouvez stocker des arbres, mais vous devez choisir une bonne représentation pour eux. Vous pouvez utiliser des clés entières (assurez-vous qu'elles sont stockées dans l'ordre des octets big-endian car BDB utilise l'ordre lexicographique sur les clés) et avez simplement une structure comme valeur contenant une liste d'entiers pour les enfants. Cependant, vous devrez toujours écrire tous vos algorithmes de traversée à la main. Sans savoir quelles exigences vous avez pour vos données hiérarchiques, il est difficile de donner une suggestion plus concrète.

SpeedWelding, pour ce qu'il est, Berkeley DB ne peut probablement pas aller beaucoup plus vite (c'est-à-dire que vous ne trouverez pas beaucoup plus rapidement, surtout si vous êtes prêt à sacrifier certaines propriétés ACID). Il vous donne un contrôle presque complet sur votre interface vers la carte, donc en théorie vous pourriez probablement construire une structure hautement optimisée pour votre cas d'utilisation particulier. Toutefois, étant donné l'interface de bas niveau, si vous implémentez des jointures, des requêtes de filtre complexes ou n'importe quel type de langage de requête non trivial, vous devrez écrire du code et des algorithmes très rapides pour suivre la grande bases de données relationnelles là-bas. Si vos données peuvent être modélisées par XML (eugh, mais je sais que certaines personnes l'apprécient), il existe une base de données existante basée sur BDB appelée BDB XML (également par Sleepycat, qui fait maintenant partie d'Oracle).Cela vous permet de stocker des documents XML arbitraires dans la base de données et d'exécuter des requêtes XPath et XQuery rapides sur la base de données. Je ne pense pas qu'il existe encore une API .NET officielle, mais je suis à peu près sûr d'avoir rencontré une liaison .NET non officielle. En général, sauf si vous avez des exigences très particulières que les solutions existantes ne permettent pas (cela ne semble pas être le cas avec votre scénario), je vous déconseille de rouler votre propre base de données (même sur haut de BDB) sauf si vous êtes très compétent avec des algorithmes efficaces et l'optimisation du code. Si vous stockez des triplets RDF, il existe des bases de données dédiées, et même les bases de données relationnelles ne leur sont pas particulièrement inadaptées. BDB XML est toujours une solution viable pour cela aussi. C'est finalement votre choix, mais si j'étais vous, je choisirais de travailler sur les problèmes les plus intéressants sans avoir à gérer les opérations de base de données de bas niveau (et j'utiliserais donc une couche mince sur le paquetage RDF).

+0

J'ai mis à jour ma question –

+0

Mis à jour pour répondre à cette question :) – copumpkin

+0

Ce lecteur de flux en ligne n'est pas seulement un grand magasin de données. Il aura de solides connaissances scientifiques (traitement de texte et extraction de connaissances). Donc vous pensez que MySQL ira bien dans ce cas? –

1

Les structures hiérarchiques peuvent être stockées dans des magasins de valeurs-clés en utilisant un attribut parent ou enfant.

Si vous souhaitez qu'un parent ait 1 ou plusieurs enfants, utilisez un attribut parent sur chaque enregistrement et que les nœuds racine aient un parent d'ID 0 ou une autre valeur significative.

Si vous souhaitez qu'un enfant ait 1 ou plusieurs parents, utilisez un attribut enfant sur chaque enregistrement.

Si vous voulez, les nœuds peuvent avoir plusieurs parents et les enfants utilisent une table distincte pour stocker les relations. De cette façon, vous pouvez parcourir l'arborescence en interrogeant les nœuds qui ont un parent ou un enfant donné.

+0

Donc, en résumé, je dois implémenter des relations manuellement? Que diriez-vous de la vitesse? –

+0

Oui, mais c'est le cas avec tous les SGBDR. Si vous utilisez un index dans la colonne de relation, il s'agit d'une seule recherche de ligne indexée. Les performances doivent donc être bonnes tant que vous ne parcourez pas toute la hiérarchie en permanence. –

+0

Vous donne +1. Je vous remercie! –