Ein Memo, dass ich den Datenspeicher mit Python berührt habe

Ich habe in den letzten sechs Monaten nach und nach den Datenspeicher von GCP berührt.

Lassen Sie uns die verschiedenen Gefühle beim Berühren des Datenspeichers zur Kenntnis nehmen. Ich würde es gerne mit DynamoDB vergleichen, aber es ist fast ein Merkmal von NoSQL. Es gab nicht viele Artikel, die mich über Designrichtlinien und Änderungen im Denken bei RDB-> KVS unterrichteten, deshalb habe ich sie zusammengefasst.

["NoSQL-Handbuch für RDB-Ingenieure"](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) Ich denke, es ist bis zu einem gewissen Grad in einem Buch wie diesem geschrieben, aber ich glaube nicht, dass Datastore erwähnt wurde. ..

Ich berühre übrigens von GAE / py.

Korrespondenz mit dem Konzept der RDB

Lassen Sie uns zunächst die Grundbegriffe klären.

Neue Grundkenntnisse der Datenbank Grundlegendes zu Googles riesigem verteilten Datenspeicher Bigtable and Datastore (4/12) Wie in diesem Artikel erwähnt,

datastore RDB
kind table
entity record
property field

Es scheint.

Funktionen des Datenspeichers

Ich fasste zusammen, woran ich beim Entwerfen des Tisches dachte. Grundsätzlich denke ich, dass es ein allgemeines Konzept in Datastore oder schemaless NoSQL ist.

Kein Tisch

Der Datenspeicher hat nicht das Konzept einer Tabelle, sondern verwaltet mehrere Arten von Entitäten an einem Ort. Es sieht also so aus, als würde sich Art wie ein Tisch verhalten.

Übrigens hat GCP Namespace genannt? GAE? Es gibt auch ein Konzept, mit dem Sie einen unabhängigen Datenspeicher für dasselbe Projekt erstellen können.

Transaktionen mit mehreren Arten

In der Transaktion können mehrere Arten gleichzeitig aktualisiert werden, indem sie in die Entitätsgruppe eingefügt werden. Es scheint jedoch eine Einschränkung zu geben, dass nur etwa 1 / s in eine Entitätsgruppe eingeordnet werden kann.

Die Verwendung des Schlüssels ist schnell

Die Entität mit Schlüssel zu bekommen ist sehr schnell. Sie können eine Eigenschaft erst abrufen, nachdem Sie eine Entität erhalten haben. Die Abfrage kann also nur die Liste der Schlüssel abrufen. Wenn Sie also eine Abfrage normal ausgeben, scheint der Inhalt intern verzögert zu sein.

Konsistenz

Es gibt einen Kompromiss für Integrität.

Wenn es sich um einen normalen Put handelt, der nicht in die Entitätsgruppe aufgenommen werden kann, ist die resultierende Konsistenz garantiert. Dies spiegelt die Ergebnisse nicht sofort wider und einige Abfragen geben für eine Weile alten Inhalt zurück. (Bequemlichkeit des Knotens?) Die Einordnung in eine Entitätsgruppe garantiert eine hohe Konsistenz auf Kosten einer begrenzten Aktualisierungshäufigkeit, und neue Informationen können sofort abgerufen werden.

Design-Hinweise

Beginnen Sie mit dem Entwerfen aus der Sicht

Aus Sicht der Datenverwaltung erscheint es sehr seltsam, aber beim Entwerfen eines Datenspeichers ist es besser, Objekte mit Ansicht zu entwerfen, dh wie Daten angezeigt und verarbeitet werden.

Mit anderen Worten, es ist notwendig, Anwendungsfälle für die Datenerfassung / -aktualisierung in der Entwurfsphase richtig zu antizipieren. Möchten Sie beispielsweise die Benutzerliste oder Daten abrufen? Eine solche.

Der Grund hängt mit der unten beschriebenen Denormalisierung zusammen, aber die API benötigt immer mehr Zeit, wenn eine Reihe von Abfragen ausgegeben werden. Es ist schlecht für UX, und wenn Sie GAE verwenden, gibt es ein Minutenlimit. Daher ist es besser zu denken, dass Sie etwas zusammenbringen sollten, das zuerst als Daten angezeigt werden soll. Lassen Sie uns die Designrichtlinien in RDB wegwerfen.

Denormalisierungsempfehlung

Im Gegensatz zu RDB ist es im Datenspeicher fast unmöglich, Aggregate zu verarbeiten. Daher gab es viele Artikel, die eine solche Technik als Summieren empfahlen oder Informationen enthielten, auf die bekanntermaßen in allen Tabellen so weit wie möglich im Voraus Bezug genommen wurde.

Holen Sie sich so viel wie möglich mit Schlüssel

Ich persönlich denke, das ist der wichtigste Punkt. Wenn Sie eine Suche oder Abfrage haben, erhalten Sie diese per Abfrage, aber am Ende zeigt KVS (obwohl es im engeren Sinne anders sein kann) seinen wahren Wert bei der schlüsselgetriggerten Erfassung. Die Konsistenz zum Zeitpunkt der Verlängerung ist auch garantiert, wenn der Schlüssel erworben wird. Und wie ich später bemerkte, kann ich es nur mit Schlüssel in der Transaktion w bekommen

Listenerfassung ist nur der Schlüssel

Ich habe nicht viel geübt, aber ich schwitze Es ist schneller, die Schlüsselliste und dann eine bestimmte Anzahl von Entitäten abzurufen, anstatt zu versuchen, alle Eigenschaften abzurufen. Wenn Sie nur den Namen benötigen, holen Sie sich den Schlüssel mit der Option get und zeigen Sie ihn an.

Artikel, auf die verwiesen wird

Ich habe nach Artikeln gesucht, die beim Entwerfen von Daten hilfreich sein könnten. Alle von ihnen sind alte Artikel, aber sie scheinen bis zu einem gewissen Grad hilfreich zu sein.

Es gibt jedoch auch Umgehungsinformationen, sodass dieser Bereich aufgrund von Aktualisierungen möglicherweise nicht erforderlich ist. Insbesondere wenn Sie einen Teil der Eigenschaftsinformationen in den Schlüssel einfügen und die Schlüsselliste abrufen, müssen Sie sich nicht den Inhalt der Entität ansehen, was etwas Besonderes zu sein scheint.

Entwurfsmuster für das ITPro-Cloud-Design [Google App Engine Edition] Erhöhen Sie die Suchgeschwindigkeit durch Entwicklung eines Schema-Designs

Es war leicht zu verstehen, wie sich die Entwurfsmethode von RDB unter Verwendung von SQL unter dem Gesichtspunkt der Denormalisierung unterscheidet.

Was geschrieben steht:

Best Practice in Google App Engine, Teil 1: Datenspeicher

Satoshi Nakajimas Blog schrieb auch über Datastore. Hier wird auch eine Denormalisierung empfohlen, aber es war auch leicht zu verstehen, wie die Entitätsgruppe und die Entwurfsrichtlinie verwendet werden. Ich hatte jedoch den Eindruck, dass sich das Problem der Abfragegeschwindigkeit und der hohen Fehlerrate seit der Zeit dieses Blogs erheblich verbessert hat.

Was geschrieben steht:

[gae] Teilen Sie die Entität in zwei --Wie BuddyPoke-Skalen auf Facebook mit Google App Engine

Es scheint eine Möglichkeit zu geben, die Entität für get und put aufzuteilen. (Ich denke, diese Art ist auch anders) Dies ist möglicherweise nicht sehr praktisch.

Konzept der Datenorganisation im Google Cloud-Datenspeicher

Dies ist der offizielle Google-Blog im letzten Jahr, aber er ist sehr hilfreich für den Einstieg.

Recommended Posts

Ein Memo, dass ich den Datenspeicher mit Python berührt habe
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
Ein Memo, das ich schnell in Python geschrieben habe
Ich habe mit Python eine Lotterie gemacht.
Ich mochte den Tweet mit Python. ..
Ich habe mit Python einen Daemon erstellt
Ein Memo, das mit Python & Spark Daten aus dashDB liest
Ich habe das Windows PowerShell-Kochbuch durch ein Python-Skript ersetzt.
[Python] Ein Programm, das Treppen mit # erstellt
Ich habe ein Paket erstellt, das morphologische Analysegeräte mit Python vergleichen kann
Ich möchte einen Platzhalter verwenden, den ich mit Python entfernen möchte
Ich habe mit Python einen Zeichenzähler erstellt
Ich habe eine Heatmap mit Seaborn [Python] gezeichnet.
Ein Memo mit Python2.7 und Python3 in CentOS
Durchsuche das Labyrinth mit dem Python A * -Algorithmus
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe ein Shuffle gemacht, das mit Python zurückgesetzt (zurückgesetzt) werden kann
Was ich mit Python-Arrays gemacht habe
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
Ich habe mit Python eine Hex-Map erstellt
Eine typisierte Welt, die mit Python beginnt
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe ein Programm erstellt, das den Tierkreis mit tkinter automatisch berechnet
[Python] Ein Programm, das die Partitur rundet
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe mit Python einen Neuronensimulator erstellt
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden
Ein Memo, das durch Umbenennen der Dateinamen im Ordner mit Python organisiert wird
Ein Hinweis, mit dem Sie die Python-Umgebung von Pineapple mit pyenv ändern können
Extrahieren Sie mit Python Zeilen, die den Bedingungen entsprechen, aus einer Textdatei
Ich erhalte einen Python No-Modul mit dem Namen 'Encodings' mit dem Befehl aws
Ich habe ein Tool erstellt, das die Dekomprimierung mit CLI (Python3) etwas erleichtert.
Ich habe ein Modul PyNanaco erstellt, das Nanaco-Guthaben mit Python belasten kann
Ein Modell, das die Gitarre mit fast.ai identifiziert
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
[Python] Holen Sie sich die Dateien mit Python in den Ordner
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Memo, mit dem ein Diagramm zum Plotten animiert wurde
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
Ich möchte ein Spiel mit Python machen
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Ein Memo beim Erstellen einer Python-Umgebung mit Miniconda
Ich habe einige der neuen Funktionen von Python 3.8 touched angesprochen
Ich möchte mit Python in eine Datei schreiben
Ich habe mit Python ein Bin-Picking-Spiel gemacht
Mattermost Bot mit Python gemacht (+ Flask)
Ich habe PyQCheck, eine Bibliothek, die QuickCheck mit Python ausführen kann, in PyPI registriert.
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Ich habe Python mit einem schönen Mädchen in Paiza # 02 gelernt
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
[Python] Ein Programm, das die Anzahl der Täler zählt
[Rezept des Trainers] Ich habe die Flasche des Python-Frameworks berührt.