144 votes

Comment suivez-vous les relations d’enregistrement dans NoSQL?

Je suis à essayer de comprendre l'équivalent de clés étrangères et les index en NoSQL KVP ou Document de bases de données. Depuis il n'y a pas de pivot tables (pour ajouter des touches de marquage d'une relation entre deux objets), je suis vraiment perplexe quant à comment vous pourriez être en mesure de récupérer les données d'une manière qui serait utile pour les pages web normales.

Dire que j'ai un utilisateur, cet utilisateur laisse beaucoup de commentaires sur tout le site. La seule façon que je peux penser à garder la trace des utilisateurs commentaires: 1) de les Intégrer dans l'objet utilisateur (ce qui semble tout à fait inutile) 2) créer et maintenir un user_id:comments de la valeur qui contient une liste de chaque commentaire de la touche [commentaire:34, commentaire:197, etc...], afin que je puisse les récupérer au besoin.

Toutefois, en prenant le second exemple, on va bientôt frapper un mur de briques quand vous l'utilisez pour le suivi d'autres choses comme une clé appelée "active_comments" qui peut contenir 30 millions d'identifiants rendant le coût d'une TONNE pour interroger chaque page il suffit de connaître quelques dernières active commentaires. Il serait également très sujettes à la course à conditions que le nombre de pages peut essayer de mettre à jour à la même heure.

Comment puis-je suivre les relations comme celle-ci dans une base de données NoSQL?

  • Tous les commentaires d'un internaute
  • Tous les actifs des commentaires
  • Tous les posts tagged avec [mot-clé]
  • Tous les étudiants dans un club ou tous les clubs de l'étudiant qui est dans

Ou suis-je en pensant à cette erreur?

221voto

Bill Karwin Points 204877

Toutes les réponses pour savoir comment stocker plusieurs-à-plusieurs associations dans le "NoSQL moyen de" réduire à la même chose: le stockage des données de manière redondante.

En NoSQL, vous n'avez pas la conception de votre base de données sur la base des relations entre les entités de données. De la conception de votre base de données basée sur les requêtes que vous exécutez contre elle. Utiliser les mêmes critères que pour éliminer une base de données relationnelle: si c'est plus important pour les données de cohésion (penser à des valeurs dans une liste séparée par des virgules à la place d'une table normalisée), puis le faire de cette façon.

Mais cette inévitablement optimise pour un type de requête (par exemple des commentaires par tout utilisateur d'un article donné), au détriment d'autres types de requêtes (commentaires article par un utilisateur donné). Si votre application a besoin de deux types de requêtes pour être aussi optimisé, vous ne devez pas éliminer. Et de même, vous ne devez pas utiliser une solution NoSQL si vous avez besoin d'utiliser les données d'une manière relationnelle.

Il y a un risque avec la dénormalisation et de la redondance qui redondante des ensembles de données qui permettra de sortir de la synchronisation avec l'un l'autre. Il s'agit d'une anomalie. Lorsque vous utilisez un normalisée de base de données relationnelle, SGBDR peut éviter des anomalies. Dans une base de données dénormalisée ou NoSQL, il devient de votre responsabilité d'écrire le code de l'application pour éviter des anomalies.

On pourrait penser que ce serait très bon pour une base de données NoSQL pour faire le travail difficile de la prévention des anomalies pour vous. Il est un modèle qui peut le faire -- le paradigme relationnel.

4voto

user425720 Points 2419

Le couchDB approche suggèrent à émettre de la bonne classes de trucs dans la carte de phase et de les résumer dans réduire.. Alors vous pouvez mapper tous les commentaires et émettent '1' pour l'utilisateur donné et, plus tard, imprimez-la uniquement. Cela nécessiterait cependant, beaucoup de disque de stockage de construire des vues persistantes de tous suivi des données de couchDB. btw, ils ont aussi cette page du wiki sur les relations: http://wiki.apache.org/couchdb/EntityRelationship.

Riak sur l'autre main a un outil pour construire des relations. Il est le lien. Vous pouvez entrer l'adresse du lien (ici, commentaires) de document de la "racine" du document (ici de l'utilisateur document). Il a un truc. S'il est distribué, il peut être modifié à la fois dans de nombreux endroits. Il sera la cause de conflits et comme un résultat énorme vecteur de l'horloge de l'arbre :/ ..pas si mal, pas si bon.

Riak a aussi encore un autre mécanisme. Il dispose de 2-couche de nom de la clé de l'espace, ainsi appelé seau et d'une clé. Donc, pour les étudiants d'exemple, Si nous disposons du club A, B et C et des étudiants StudentX, StudentY vous pourriez maintenir convention suivante:

{ Key = {ClubA, StudentX}, Value = true }, { Key = {ClubB, StudentX}, Value = true }, { Key = {ClubA, StudentY}, Value = true }

et pour lire le rapport juste la liste des clés dans des seaux. Quoi de mal à cela? Il est sacrément lent. Liste des seaux n'a jamais été la priorité pour riak. Il est de mieux en mieux et mieux tho. btw. vous ne perdez pas de mémoire, parce que cet exemple {true} peut être lié à un seul profil complet de StudentX ou Y (ici, les conflits ne sont pas possibles).

Comme vous le voyez il NoSQL != NoSQL. Vous avez besoin de regarder spécifiques de mise en œuvre et de tester par vous-même.

Mentionné avant de la Colonne magasins ressemblent bon ajustement pour les relations.. mais tout dépend de votre A et C et P;) Si vous n'avez pas besoin et que vous avez moins de Peta octets, il suffit de laisser, aller de l'avant avec MySql ou Postgres.

bonne chance

3voto

Tom Clarkson Points 12369
  1. utilisateur:nom d'utilisateur:commentaires est une approche raisonnable - il pense que l'équivalent d'une colonne d'index dans SQL, avec l'ajout de l'exigence que vous ne pouvez pas interroger sur indexée colonnes.

  2. C'est là que vous devez penser à vos exigences. Une liste de 30 millions d'articles n'est pas déraisonnable parce qu'elle est lente, mais parce qu'il est impossible de faire quelque chose avec elle. Si votre exigence est d'afficher quelques commentaires récents vous êtes mieux de garder une très courte liste est mise à jour chaque fois qu'un commentaire est ajouté - rappelez-vous que le NoSQL n'a pas d'exigence de normalisation. Des conditions de course sont un problème avec les listes de base de la valeur de la clé de magasin, mais généralement soit votre plate-forme prend en charge les listes correctement, vous pouvez faire quelque chose avec des serrures, ou vous n'avez pas de soins sur l'échec de la mise à jour.

  3. De même que pour les commentaires de l'utilisateur - créer un index de mots clés:les postes

  4. Plus de la même chose - probablement une liste des clubs en tant que propriété de l'étudiant et d'un index sur ce champ pour tous les membres d'un club

0voto

smartcaveman Points 15610

Je pense que RavenDB offre une bonne solution à ce problème d’indexation. Les informations sur la page principale http://ravendb.net/ expliquent suffisamment le concept pour que vous puissiez probablement créer quelque chose d'analogue pour votre technologie.

-2voto

ur001 Points 31

Utilisez NoSQL + Solr / Sphinx / etc. Aucun projet auquel j'ai participé ne se passe sans moteur de recherche avancé. Je pense que NoSQL + SE est meilleur que RDBM + SE dans de nombreux cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X