web-dev-qa-db-fra.com

Rejoignez l'opération avec NOSQL

J'ai parcouru quelques articles concernant Bigtable et NOSQL. Il est très intéressant qu'ils évitent les opérations JOIN.

À titre d'exemple de base, prenons la table des employés et des services et supposons que les données sont réparties sur plusieurs tables/serveurs.

Je veux juste savoir, si les données sont réparties sur plusieurs serveurs, comment pouvons-nous effectuer les opérations JOIN ou UNION?

40
Sri

Lorsque vous avez des données extrêmement volumineuses, vous souhaitez probablement éviter les jointures. Cela est dû au fait que la surcharge d'une recherche de clé individuelle est relativement importante (le service doit déterminer le ou les nœuds à interroger, les interroger en parallèle et attendre les réponses). Par surcharge, j'entends la latence, pas la limitation du débit.

Cela rend les jointures vraiment nulles car vous auriez besoin de faire beaucoup de recherches de clés étrangères, ce qui finirait par aller vers de très nombreux nœuds différents (dans de nombreux cas). Vous voudriez donc éviter cela comme un modèle.

Si cela n'arrive pas très souvent, vous pourriez probablement prendre le coup, mais si vous voulez en faire beaucoup, cela peut valoir la peine de "dénormaliser" les données.

Le genre de choses qui sont stockées dans les magasins NoSQL est généralement assez "anormal" en premier lieu. Il n'est pas rare de dupliquer les mêmes données dans toutes sortes d'endroits différents pour faciliter les recherches.

De plus, la plupart des nosql ne prennent pas (vraiment) en charge les index secondaires non plus, ce qui signifie que vous devez dupliquer des éléments si vous souhaitez interroger par un autre critère.

Si vous stockez des données telles que des employés et des services, vous êtes vraiment mieux avec une base de données conventionnelle.

39
MarkR

Vous devrez effectuer plusieurs sélections et joindre les données manuellement dans votre application. Voir this SO post pour plus d'informations. De ce post:

Les ensembles de données Bigtable peuvent être interrogés à partir de services comme AppEngine en utilisant un langage appelé GQL ("gee-kwal") qui est basé sur un sous-ensemble de SQL. Toute sorte de commande JOIN est manifestement absente de GQL. En raison de la nature distribuée d'une base de données Bigtable, effectuer une jointure entre deux tables serait terriblement inefficace. Au lieu de cela, le programmeur doit implémenter une telle logique dans son application, ou concevoir son application de manière à ne pas en avoir besoin.

5
Kaleb Brasee

Kaleb a raison. Vous écrivez du code personnalisé avec une solution NoSQL si vos données ne s'intègrent pas bien dans un magasin clé-valeur. Le traitement de réduction de mappage/asynchrone et les caches de vues personnalisées sont courants. Brian Aker a fait une présentation très drôle (et satirique et biaisée) à l'OpenSQLCamp de novembre 2009 http://www.youtube.com/watch?v=LhnGarRsKnA . Passer en 40 secondes pour entendre parler des jointures.

3
Ken Fox