Frage

Als Beispiel Google App Engine benutzt Google-Datenspeicher, kein Standard-Datenbank, um Daten zu speichern. Hat jemand irgendwelche Tipps für die Verwendung von Google-Datenspeicher anstelle von Datenbanken? Es scheint, ich trainiert habe meine Meinung zu 100% in Objektbeziehungen zu denken, die direkt auf Tabellenstrukturen abzubilden, und jetzt ist es schwer, etwas anders zu sehen. Ich kann einige der Vorteile von Google-Datenspeicher (zum Beispiel Leistung und die Fähigkeit, Daten zu verteilen) verstehen, aber einige gute Datenbank-Funktionalität geopfert wird (z Joins).

Hat jemand, der mit Google-Datenspeichern oder BigTable hat keine guten Ratschläge für die Arbeit mit ihnen gearbeitet hat?

War es hilfreich?

Lösung

Da ist im Wesentlichen zwei Dinge zu über die Datenspeicher von App Engine verwendet werden, wenn im Vergleich zu ‚traditionellen‘ relationalen Datenbanken:

  • Der Datenspeicher macht keinen Unterschied zwischen Einfügungen und Aktualisierungen. Wenn Sie setzen call () auf einer Einheit, wird diese Einheit auf den Datenspeicher mit seinen einzigartigen Schlüsseln gespeichert ist, und alles, was hat die Schlüssel überschrieben werden. Im Grunde genommen jede Einheit Art in dem Datenspeicher wirkt wie eine riesige Karte oder sortierte Liste.
  • Querying, wie Sie erwähnt, ist viel begrenzter. Nein verbindet, für einen Start.

Der Schlüssel ist daran zu erkennen - und der Grund für diese beiden Unterschiede - ist, dass Bigtable im Grunde wirkt wie ein riesiger bestellt Wörterbuch. Somit legt ein Verkaufsvorgang nur um den Wert für einen Schlüssel - unabhängig von einem vorherigen Wert für diesen Schlüssel und Abrufoperationen sind auf Einzeltasten oder zusammenhängende Bereiche des Schlüssels holen. Ausgefeiltere Abfragen mit Indizes möglich gemacht werden, die nur Tabellen ihrer eigenen grundsätzlich sind, so dass Sie komplexere Abfragen implementieren, wie auf zusammenhängende Bereiche abtastet.

Sobald Sie absorbiert, dass Sie die Grundkenntnisse benötigt, um die Möglichkeiten und Grenzen des Datenspeichers zu verstehen. Einschränkungen, die willkürlich scheinen haben wahrscheinlich mehr Sinn machen.

Der Schlüssel hier ist, dass, obwohl diese Einschränkungen über sind, was Sie in einer relationalen Datenbank zu tun, die gleichen Einschränkungen, was es praktisch machen, um die Art von Größe zu skalieren, die Bigtable ausgelegt ist, zu behandeln. Sie können einfach nicht die Art von Abfrage ausführen, die auf dem Papier gut aussieht, aber fürchterlich langsam in einer SQL-Datenbank.

Im Hinblick darauf, wie sich ändern, wie Sie Daten darstellen, das Wichtigste ist, Vorkalkulation. Statt tun schließt sich zum Zeitpunkt der Abfrage, vorberechnen Daten und speichern sie in dem Datenspeicher, wo immer möglich. Wenn Sie einen zufälligen Datensatz auswählen mögen, erzeugt eine Zufallszahl und speichert mit jedem Datensatz. Es gibt ein ganzes Kochbuch dieser Art von Tipps und Tricks hier Edit: Die Kochbuch ist nicht mehr vorhanden.

Andere Tipps

Die Art und Weise habe ich über den Geist Schalter geht ist über die Datenbank ganz zu vergessen.

In der relationalen db Welt müssen Sie immer über Datennormalisierung kümmern und Ihre Tabellenstruktur. Graben sie alle. Nur Layout Ihrer Webseite ein. Legen Sie sie alle aus. Nun sie betrachten. Sie sind bereits 2/3 dort.

Wenn Sie den Begriff vergessen, dass die Datenbankgröße Angelegenheiten und Daten sollten nicht dann sind Sie 3/4 dort dupliziert werden, und Sie haben nicht einmal einen Code zu schreiben! Lassen Sie Ihren Blick auf Ihre Modelle diktieren. Sie müssen nicht Ihre Objekte nehmen und sie 2-dimensionale mehr als in der relationalen Welt. Sie können nun Objekte mit Form speichern.

Ja, das ist eine vereinfachte Erklärung der Tortur, aber es hat mir geholfen, über Datenbanken zu vergessen und nur einen Antrag stellen. Ich habe gemacht 4 App Engine-Apps so weit diese Philosophie mit und es gibt mehr zu kommen.

ich lache immer, wenn die Leute kommen mit - es ist nicht relational ist. Ich habe cellectr in django geschrieben und hier ist ein Ausschnitt aus meinem Modell unten. Wie Sie sehen, ich habe Ligen, die von Benutzern verwaltet oder betreut. Ich kann aus einer Liga erhalte alle Manager oder von einem bestimmten Benutzer kann ich die Liga sie Trainer oder Manager zurück.

Nur weil es keine spezifische Fremdschlüssel Unterstützung bedeutet nicht, Sie nicht ein Datenbankmodell mit Beziehungen haben können.

Meine zwei Pence.


class League(BaseModel):
    name = db.StringProperty()    
    managers = db.ListProperty(db.Key) #all the users who can view/edit this league
    coaches = db.ListProperty(db.Key) #all the users who are able to view this league

    def get_managers(self):
        # This returns the models themselves, not just the keys that are stored in teams
        return UserPrefs.get(self.managers)

    def get_coaches(self):
        # This returns the models themselves, not just the keys that are stored in teams
        return UserPrefs.get(self.coaches)      

    def __str__(self):
        return self.name

    # Need to delete all the associated games, teams and players
    def delete(self):
        for player in self.leagues_players:
            player.delete()
        for game in self.leagues_games:
            game.delete()
        for team in self.leagues_teams:
            team.delete()            
        super(League, self).delete()

class UserPrefs(db.Model):
    user = db.UserProperty()
    league_ref = db.ReferenceProperty(reference_class=League,
                            collection_name='users') #league the users are managing

    def __str__(self):
        return self.user.nickname

    # many-to-many relationship, a user can coach many leagues, a league can be
    # coached by many users
    @property
    def managing(self):
        return League.gql('WHERE managers = :1', self.key())

    @property
    def coaching(self):
        return League.gql('WHERE coaches = :1', self.key())

    # remove all references to me when I'm deleted
    def delete(self):
        for manager in self.managing:
            manager.managers.remove(self.key())
            manager.put()
        for coach in self.managing:
            coach.coaches.remove(self.key())
            coaches.put()            
        super(UserPrefs, self).delete()    

Ich kam aus relationaler Datenbank Welt dann fand ich diese Datastor Sache. es dauerte mehrere Tage, um von ihm zu hängen. Nun gibt es einige meiner Ergebnisse.

Sie müssen bereits wissen, dass Datenspeicher bauen ist maßstäblich, und das ist die Sache, die sie von RDMBS trennt. Maßstab besser mit großen Datenmengen, App Engine getan hat einige Änderungen (etwas bedeutet, viele Änderungen).

RDBMS VS Datastor
Struktur
In der Datenbank können wir unsere Daten in den Tabellen in der Regel strukturieren, Reihen, die in Datastore ist es wird Kinds und Entities .

Beziehungen
Die meisten Menschen in RDBMS, folllows die One-to-One, Many-to-One, Many-to-Many-Beziehung, in Datastor, wie es "Nein Joins" Ding hat aber noch können wir unsere Normalisierung mit „erreichen Reference “zB One-to-One-Beziehung Beispiel .

Indizes
In der Regel in RDMBS wir machen Indizes wie Primärschlüssel, Fremdschlüssel, eindeutiger Schlüssel und Index Taste, um die Suche zu beschleunigen und unsere Datenbank-Performance steigern. Im Datenspeicher, müssen Sie atleast einen Index pro Art machen (es wird automatisch href="https://stackoverflow.com/questions/7902065/how-gae-datastore-key-is-generated"> erzeugen ob Sie es oder nicht mögen), weil Datenspeicher Ihr Unternehmen auf der Grundlage dieser Indizes zu suchen und glauben Sie mir, das ist der beste Teil, In RDBMS können Sie nicht-Indexfeld Suche mit, obwohl es einige Zeit dauern, aber es wird. In Datastor können Sie nicht nicht-Index Eigenschaft Suche.

Count
In RDMBS, ist es viel einfacher zu zählen (*), sondern in Datenspeicher, bitte denke nicht, daß auch sie in gewohnter Weise (Yeah gibt es eine Zählfunktion), wie es ist
1000-Grenze und es so viel kostet small Opertion als Einheit , die nicht gut ist, aber wir haben immer eine gute Wahl, können wir verwenden Shard Zähler .

UNIQUE-Einschränkungen
In RDMBS, Wir lieben diese Funktion richtig? aber Datastore hat seine eigene Art und Weise. Sie können nicht eine Eigenschaft als einzigartig :( definieren.

Abfrage
GAE Datatore bietet eine bessere Funktion viel LIKE (Oh nein! Datenspeicher muss nicht wie Keyword) SQL, die GQL .

Daten Insert / Update / Delete / Select
Das, wo wir alle daran interessiert sind, wie in RDMBS wir eine Abfrage für Insert, Update benötigen, löschen und wählen wie RDBMS hat Datastore setzen, löschen, bekommen (nicht zu aufgeregt), weil Datastore oder in Form von schreiben, lesen, Kleine Operationen (lesen Die Kosten für die Datenspeicher-Anrufe ) und das ist, wo die Datenmodellierung in Aktion tritt. Sie müssen diese Operationen minimieren und Ihre Anwendung am Laufen zu halten. href="https://developers.google.com/appengine/docs/python/datastore/entities#Batch_Operations" für Lesen Memcache .

Werfen Sie einen Blick auf die Objectify Dokumentation. Der erste Kommentar am unteren Rand der Seite sagt:

„Schön, obwohl man dies schrieb Objectify zu beschreiben, es ist auch eine der kurzen Erklärung von appengine Datenspeichern selbst ich je gelesen habe. Danke.“

https://github.com/objectify/objectify/wiki/Concepts

Wenn Sie denken über ORM-mapped Einheiten gewöhnt sind, dann ist das im Grunde wie ein Unternehmen-basierten Datenspeicher wie Googles App Engine funktioniert. Für so etwas verbindet, können Sie sich unter Referenzobjekte . Sie brauchen nicht wirklich besorgt zu sein, ob es verwendet BigTable für das Backend oder etwas anderes, da das Backend von den GQL und Datenspeicher-API-Schnittstellen abstrahiert wird.

So wie ich Datenspeicher sehen ist, identifiziert Art Tabelle, per se, und Einheit ist, einzelne Zeilen innerhalb der Tabelle. Wenn Google Art zu nehmen waren, als seine nur eine große Tabelle ohne Struktur und Sie können Dump, was Sie in einer Einheit wollen. Mit anderen Worten, wenn Entitäten auf eine Art nicht gebunden sind, können Sie ziemlich viel haben keine Struktur zu einer Einheit und speichert in einem Ort (eine Art großer Datei ohne Struktur, um es, jede Zeile hat eigene Struktur).

Nun zurück zum ursprünglichen Kommentar, Google-Datenspeicher und BigTable sind zwei verschiedene Dinge so nicht Google-Datenspeicher-Datenspeicher Datenspeicher Sinn verwirren. Bigtable ist teurer als BigQuery (Primary Grund, warum wir nicht mit ihm gingen). BigQuery hat richtige verbindet und RDBMS wie SQL-Sprache und billiger, warum nicht BigQuery verwenden. Davon abgesehen, BigQuery einige Einschränkungen hat, je nach Größe der Daten, die Sie könnten oder nicht, sie stoßen könnten.

, auch im Hinblick auf die in Bezug auf die Datenspeicher zu denken, ich glaube, die richtige Aussage „in Bezug auf die NoSQL-Datenbanken zu denken“ worden wären. Es gibt zu viele von ihnen in diesen Tagen da draußen, aber wenn es darum geht, Produkte mit Ausnahme von Google Cloud SQL to google (die mySQL) alles andere ist NoSQL.

in der Datenbank Welt verwurzelt ist, würde ein Datenspeicher für mich ein riesiger Tisch sein (daher der Name „BigTable“). BigTable ist ein schlechtes Beispiel aber, weil es eine Menge anderer Dinge tut, die eine typische Datenbank nicht tun könnte, und doch ist es immer noch eine Datenbank. Die Chancen stehen gut, wenn Sie wissen, dass Sie so etwas wie Googles „BigTable“ bauen müssen, werden Sie wahrscheinlich mit einer Standard-Datenbank in Ordnung sein. Sie brauchen das, weil sie verrückt Datenmengen Handhabung und Systeme zusammen, und kein kommerziell erhältliche System kann wirklich die Aufgabe, die genaue Art und Weise tun, können sie nachweisen, dass sie den Job müssen getan werden.

(BigTable Referenz: http://en.wikipedia.org/wiki/BigTable )

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top