Un mémo que j'ai touché au magasin de données avec python

J'ai touché petit à petit le magasin de données de GCP au cours des six derniers mois.

Prenons note des diverses sensations de toucher le magasin de données. Je voudrais le comparer avec DynamoDB, mais c'est presque une caractéristique de NoSQL. Il n'y avait pas beaucoup d'articles qui m'ont enseigné les directives de conception et les changements de pensée lorsque RDB-> KVS, alors je les ai résumés.

["NoSQL Guide for RDB Engineers"](http://www.amazon.co.jp/RDB%E6%8A%80%E8%A1%93%E8%80%85%E3%81%AE % E3% 81% 9F% E3% 82% 81% E3% 81% AENoSQL% E3% 82% AC% E3% 82% A4% E3% 83% 89-% E6% B8% A1% E9% 83% A8- % E5% BE% B9% E5% A4% AA% E9% 83% 8E / dp / 479804573X) Je me demande si c'est écrit dans un tel livre dans une certaine mesure, mais j'ai l'impression que Datastore n'a pas été mentionné. ..

Au fait, je touche de GAE / py.

Correspondance avec le concept de RDB

Tout d'abord, trions les termes de base.

Nouvelles connaissances de base de la base de données Comprendre l'énorme magasin de données distribué Bigtable et Datastore de Google (4/12) Comme mentionné dans cet article,

datastore RDB
kind table
entity record
property field

Il semble.

Fonctionnalités de Datastore

J'ai résumé ce que j'avais pensé lors de la conception de la table. Fondamentalement, je pense que c'est un concept courant dans Datastore ou NoSQL sans schéma.

Pas de table

Datastore n'a pas le concept de table, mais gère plusieurs entités kind en un seul endroit. On dirait donc que le genre agit comme une table.

Au fait, GCP a appelé namespace? GAE? Il existe également un concept qui vous permet de créer des banques de données indépendantes pour le même projet.

Transactions de nature multiple

Plusieurs types peuvent être mis à jour dans la transaction en même temps en les plaçant dans le groupe d'entités. Cependant, il semble qu'il existe une restriction selon laquelle seulement 1 / s environ peut être placé dans un groupe d'entités.

Utiliser la clé est rapide

L'entité obtenir avec la clé est très rapide. Vous ne pouvez obtenir une propriété qu'après avoir obtenu une entité. Ainsi, la requête ne peut obtenir que la liste des clés, donc si vous émettez une requête normalement, il semble que le contenu soit retardé en interne.

Cohérence

Il y a un compromis pour l'intégrité.

Un put normal qui ne peut pas être inclus dans le groupe d'entités garantit l'intégrité conséquente. Cela ne reflète pas les résultats immédiatement et certaines requêtes renvoient un ancien contenu pendant un certain temps. (Commodité du nœud?) Son intégration dans un groupe d'entités garantit une forte cohérence au prix d'une fréquence de mise à jour limitée et de nouvelles informations peuvent être obtenues immédiatement.

Notes de conception

Commencez à concevoir à partir de la vue

Du point de vue de la gestion des données, cela semble très étrange, mais lors de la conception du magasin de données, il semble préférable de concevoir l'objet avec View, c'est-à-dire comment les données sont affichées et traitées.

En d'autres termes, il est nécessaire d'anticiper correctement les cas d'utilisation d'acquisition / mise à jour de données au stade de la conception. Par exemple, souhaitez-vous obtenir la liste des utilisateurs ou les données? Tel.

La raison est liée à la dénormalisation décrite ci-dessous, mais l'API prend de plus en plus de temps lors de l'émission d'un certain nombre de requêtes. C'est mauvais pour l'UX, et si vous utilisez GAE, il y a une limite d'une minute. Par conséquent, il semble préférable de penser que vous devriez apporter quelque chose à afficher ensemble en tant que données en premier lieu. Jetons les directives de conception dans RDB.

Recommandation de dénormalisation

Contrairement à RDB, Datastore est presque impossible de traiter les agrégats. Par conséquent, de nombreux articles recommandaient une technique telle que le total, ou contenant des informations connues pour être mentionnées à l'avance dans tous les tableaux autant que possible.

Obtenez autant que possible avec la clé

Je pense personnellement que c'est le point le plus important. Si vous avez une recherche ou une requête, vous l'obtiendrez par requête, mais à la fin, KVS (bien que cela puisse être différent au sens strict) montre sa vraie valeur dans l'acquisition déclenchée par clé. La cohérence au moment du renouvellement est également garantie si la clé est acquise. Et comme je l'ai remarqué plus tard, je ne peux l'obtenir qu'avec la clé dans la transaction w

L'acquisition de liste n'est que la clé

Je n'ai pas beaucoup pratiqué ça, mais je transpire Il est plus rapide d'obtenir la liste des clés, puis d'obtenir un certain nombre d'entités au lieu d'essayer d'obtenir toutes les propriétés. Si vous n'avez besoin que du nom, récupérez la clé avec l'option get et affichez-la.

Articles référencés

J'ai recherché des articles qui pourraient être utiles lors de la conception de données. Ce sont tous de vieux articles, mais ils semblent être utiles dans une certaine mesure.

Cependant, il existe également des informations de contournement, de sorte que cette zone peut être inutile en raison de mises à jour. En particulier, si vous mettez une partie des informations de propriété dans la clé et obtenez la liste des clés, vous n'avez pas à regarder le contenu de l'entité, ce qui semble un peu spécial.

Modèle de conception de cloud ITPro [édition Google App Engine] Augmentez la vitesse de recherche en concevant la conception de schéma

Il était facile de comprendre en quoi la méthode de conception est différente de RDB utilisant SQL du point de vue de la dénormalisation.

Ce qui est écrit:

Bonnes pratiques sur Google App Engine, Partie 1: Datastore

Le blog de Satoshi Nakajima a également écrit sur Datastore. La dénormalisation est également recommandée ici, mais il était également facile de comprendre comment utiliser le groupe d'entités et la politique de conception. Cependant, j'ai eu l'impression que le problème de la vitesse de requête et le taux d'erreur élevé se sont considérablement améliorés depuis l'époque de ce blog.

Ce qui est écrit:

[gae] Divisez l'entité en deux - How BuddyPoke Scales on Facebook Using Google App Engine

Il semble y avoir un moyen de diviser l'entité pour obtenir et mettre. (Je pense que ce genre est également différent) Cela peut ne pas être très pratique.

Concept d'organisation des données dans Google Cloud Datastore

Ceci est le blog officiel de Google de l'année dernière, mais il est très utile pour commencer.

Recommended Posts

Un mémo que j'ai touché au magasin de données avec python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
Un mémo que j'ai écrit un tri rapide en Python
J'ai fait une loterie avec Python.
J'ai aimé le tweet avec python. ..
J'ai créé un démon avec Python
Un mémo qui lit les données de dashDB avec Python et Spark
J'ai remplacé le livre de recettes Windows PowerShell par un script python.
[Python] Un programme qui crée des escaliers avec #
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
J'ai fait un compteur de caractères avec Python
J'ai dessiné une carte thermique avec Seaborn [Python]
Un mémo contenant Python2.7 et Python3 dans CentOS
Rechercher le labyrinthe avec l'algorithme python A *
J'ai essayé un langage fonctionnel avec Python
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
Ce que j'ai fait avec les tableaux Python
Je voulais résoudre le problème ABC164 A ~ D avec Python
J'ai fait une carte hexadécimale avec Python
Un monde typé qui commence par Python
J'ai fait un jeu rogue-like avec Python
J'ai fait un programme qui calcule automatiquement le zodiaque avec tkinter
[Python] Un programme qui arrondit le score
L'histoire de la création d'un module qui ignore le courrier avec python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait un simulateur de neurones avec Python
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
Un mémo organisé en renommant les noms de fichiers dans le dossier avec python
Notez que l'environnement Python de Pineapple peut être modifié avec pyenv
Extraire les lignes qui correspondent aux conditions d'un fichier texte avec python
J'obtiens une erreur Python No module nommée'encodings 'avec la commande aws
J'ai créé un outil qui facilite un peu la décompression avec CLI (Python3)
J'ai fait un module PyNanaco qui peut charger des crédits nanaco avec python
Un modèle qui identifie la guitare avec fast.ai
J'ai essayé de "lisser" l'image avec Python + OpenCV
[Python] Récupérez les fichiers dans le dossier avec Python
J'ai fait une prévision météo de type bot avec Python.
J'ai créé une application graphique avec Python + PyQt5
J'ai essayé de "différencier" l'image avec Python + OpenCV
Mémo qui a fait un graphique pour animer avec intrigue
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
Je veux faire un jeu avec Python
Créer une page qui se charge indéfiniment avec python
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
J'ai essayé de "binariser" l'image avec Python + OpenCV
Un mémo lors de la création d'un environnement python avec miniconda
J'ai touché certaines des nouvelles fonctionnalités de Python 3.8 ①
Je veux écrire dans un fichier avec Python
J'ai fait un jeu de cueillette avec Python
Made Mattermost Bot avec Python (+ Flask)
J'ai enregistré PyQCheck, une bibliothèque qui peut effectuer QuickCheck avec Python, dans PyPI.
Une histoire à laquelle j'étais accro après la communication SFTP avec python
J'ai appris Python avec une belle fille à Paiza # 02
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
[Python] Un programme qui compte le nombre de vallées
[Recette du formateur] J'ai touché le flacon du framework Python.