Verwenden einer relationalen Datenbank im Vergleich zu JSON-Objekten für Ereignis- / Aktivitätsdaten


28

Ich arbeite an einem Projekt, in dem ich mich zwischen der Verwendung einer relationalen SQL-Standarddatenbank oder von JSON-Objekten zum Speichern von Daten zu einem Ereignis oder einer Aktivität entscheiden möchte.

Das Projekt speichert Daten für mehrere Ereignistypen. Daher habe ich beschlossen, für diese Frage nur einen Ereignistyp zu beschreiben.

Das Live-Musik-Ereignis (im Folgenden anhand des JSON-Schemas ausführlich beschrieben) ist ein Objekt, in dem Daten wie der Ort des Ereignisses, die Uhrzeit / das Datum des Ereignisses und die Kosten des Ereignisses gespeichert werden. Das Live-Musik-Ereignisobjekt verfügt sowohl über eine Eins-zu-Eins-Verbindung (Ereignis -> Name, Ereignis -> Beschreibung) als auch über eine Eins-zu-Viele-Verbindung (Ereignis -> Veranstaltungsorte, Ereignis -> Daten, Ereignis -> Tickettypen ) Beziehungen. Darüber hinaus kann das Ereignisobjekt eine oder mehrere Darsteller-IDs enthalten, die mit dem Darstellerobjekt verknüpft sind. Das Performer-Objekt speichert Daten zu Musikern, die beim Live-Musik-Event auftreten.

Die Daten werden von Benutzern sowohl mit einfachen ("Find me events with 'x' name") als auch mit komplexen ("Find me events with 'x' music genre und 'y' cost im Umkreis von 'z' von meinem aktuellen Wert abgefragt location ") abfragen. Die Daten werden von den Nutzern über ein Webformular übermittelt.

Wie Sie wahrscheinlich anhand des definierten JSON-Schemas erkennen können, wollte ich ursprünglich JSON-Objekte zum Speichern dieser Daten verwenden, aber ich habe von einigen Leuten gehört, dass ich mich an die älteren Methoden halten sollte, da meine Daten rein relational sind.

Ich würde es begrüßen, wenn ich mir Gedanken über die Vor- und Nachteile jedes Ansatzes mache, der meinen Bedürfnissen entspricht. Wenn Sie weitere Informationen benötigen, wenden Sie sich bitte an uns.

{
    "event": {
        "eventID":{
            "type":"string"
        },  
        "eventType":{
            "type":"array",
            "eventTypeItem":{
                "type":"string"
            }
        },
        "eventName":{
            "type":"string"
        },      
        "eventDescription":{
            "type":"string"
        },
        "eventVenueList":{
            "type":"array",
            "eventVenueListID":{
                "type":"integer"
            }
        },
        "eventURL":{
            "type":"string"
        },
        "eventTwitter":{
            "type":"string"
        },
        "eventFB":{
            "type":"string"
        },
        "eventInstagram":{
            "type":"string"
        },
        "eventEmail":{
            "type":"string",
            "format":"email"
        },
        "eventContactPerson":{
            "type":"string"
        },
        "eventDoorTime": {
            "type":"string",
            "format":"date-time"
        },  
        "eventPerformerIDList":{
            "type":"array",
            "liveMusicPerformerID":{
                "type":"integer"
            }
        },  
        "eventSetList":{
            "type":"array",
            "eventPerformerID":{
                "type":"integer"
            },
            "eventPerformerStartTime":{
                "type":"string",
                "format":"date-time"
            },
            "eventPerformerEndTime":{
                "type":"string",
                "format":"date-time"
            }                                   
        },
        "eventDateList": {
            "type":"array",
            "eventDateItem": {
                "type":"string",
                "format":"date-time"
            }   
        },
        "eventDateStartTime": {
            "type":"string",
            "format":"date-time"
        },
        "eventDateEndTime": {
            "type":"string",
            "format":"date-time"
        },
        "eventTicket":{ 
            "type":"array",
            "eventTicketType":{
                "type":"string" 
            },
            "eventTicketLowPrice":{
                "type":"number"
            },
            "eventTicketHighPrice":{
                "type":"number" 
            },
            "eventDatesAdvancePrice": {
                "type":"number"
            }   
        }
    },  
    "performer": {
        "performerID": {
            "type":"integer"
        },
        "performerType": {
            "type":"string"
        },
        "performerName": {
            "type":"string"
        },
        "performerAlternateName": {
            "type":"array",
            "performerAlterateNameItem":{
                "type":"string"
            }
        },
        "performerGenreList": {
            "type":"array",
            "performerGenreItem":{
                "type":"string"
            }
        },
        "performerURL": {
            "type":"string"
        }                                       
    }
}   

Ich kenne die Site-Anforderungen nicht, möchte aber nach Darstellern, Veranstaltungsorten und möglicherweise Daten suchen. Wird dies ein Problem sein, da sie in Array-Typen enthalten sind?
JeffO

Könnten Sie Ihre Abfrage nicht so programmieren, dass sie nach den Werten im entsprechenden Array sucht?
zgall1

13
JSON ist kein Speicherformat. Richtig, Sie können Daten mithilfe von Textdateien des Materials speichern, jedoch nur in den einfachsten Szenarien. JSON ist "neuer" als relationale Datenbanken und hat keine Relevanz für Ihre Entscheidung.
Robert Harvey

1
Mir ist klar, dass es sich nicht um ein Speicherformat handelt. Ich meinte, ich könnte MongoDB oder das JSON-Objekt von Postgre verwenden, um die Daten mit JSON-Formatierung zu speichern.
zgall1

2
@RobertHarvey und Wähler, in heute (2017) JSON ist ein Speicherformat : siehe PostgreSQL 9.6+ ... Basic seit ~ 2012, professionellen und reifen seit endgültig 2015 (JSONb Datentyp).
Peter Krauss

Antworten:


45

Ich denke, Ihre Frage läuft auf Folgendes hinaus: Wann sollte ich einen NoSQL-Ansatz im Vergleich zu RDBMS verwenden? Sie haben sich früh für JSON entschieden (eine NoSQL-gerechte Entscheidung), vielleicht weil Sie Ajax-Konsumenten haben.

Die Antwort auf die Frage, wann Sie NoSQL-Ansätze im Vergleich zu RDBMS verwenden sollten, hängt im Wesentlichen davon ab, mit welcher Art von Daten Sie arbeiten und welche Konsumenten Sie erwarten. Wenn Ihre Daten im Wesentlichen relational sind (relativ flache Hierarchien, keine seltsamen Datentypen wie Bilder oder Audiodaten, vorhersagbare Beziehungen zwischen den Schemata, die leicht in Schlüsseln beschrieben werden können) und Ihre Konsumenten möglicherweise Personen einbeziehen, die Business Intelligence-Abfragen durchführen möchten (Ad-hoc-Abfrage), dann ist ein RDBMS der richtige Weg. Es ist ziemlich einfach, eine Abfrage in eine JSON-Darstellung umzuwandeln, sodass Ihre Ajax-Konsumenten nicht wesentlich belastet werden. Es wird lediglich ein wenig Transformationscodierung in Ihre Endpunkte eingefügt (REST / SOAP / Was auch immer). UmgekehrtWenn Ihre Daten sehr hierarchisch sind (tiefe Schemata), seltsame Datentypen wie Bilder, Audio, Video usw. enthalten, gibt es nur wenige Beziehungen zwischen Entitäten, und Sie wissen, dass Ihre Endbenutzer kein BI durchführen, dann NoSQL / Speichern JSON kann angemessen sein.

Selbstverständlich sind auch diese allgemeinen Richtlinien nicht wirklich solide. Der Grund, warum Google das Google-Dateisystem MapReduce (eine Arbeit, mit der Doug Cutting Hadoop bei Yahoo erstellte) und später BigQuery (eine NoSQL-orientierte [schemenlose] Methode zum Verwalten großer Datenmengen) entwickelte, war genau, dass sie viele Ad-hoc-Funktionen hatten BI-Anforderungen, und sie konnten keine relationalen Ansätze erhalten, um auf die Tera / Peta / Exa / Zetta / Yotta-Skalen zu skalieren, die sie zu verwalten versuchten. Der einzig praktikable Ansatz bestand darin, die Benutzerfreundlichkeit von Ad-hoc-Abfragen zu verringern, die ein RDBMS bietet, und einen einfachen Algorithmus (MapReduce) zu verwenden, der für eine bestimmte Abfrage relativ einfach codiert werden konnte.

In Anbetracht Ihres obigen Schemas würde meine Frage im Wesentlichen lauten: Warum würden Sie kein RDBMS verwenden? Ich sehe keinen Grund, es nicht zu tun. Unser Beruf soll sich eher an Ingenieuren als an der Mode orientieren. Deshalb sollte unser Instinkt darin bestehen, die einfachste Lösung zu finden, die funktioniert, oder? Ich meine, Ihre Endgeräte müssen möglicherweise ein wenig übersetzt werden, wenn Ihre Kunden Ajaxy sind, aber Ihre Daten sehen sehr flach aus und es ist wahrscheinlich, dass Geschäftsanwender alle Arten von Ad - hoc - Abfragen für Dinge wie Musikereignisse durchführen möchten (Welche) Die Veranstaltung war letztes Jahr im Umkreis von 80 Kilometern um unsere Hauptstadt am meisten besucht?)

"Geh nicht zu den Elfen um Rat, denn sie werden sowohl Nein als auch Ja sagen." - Frodo


"Unser Beruf sollte sich eher an Ingenieuren als an Mode orientieren. Deshalb sollte unser Instinkt darin bestehen, die ..." BESTE Lösung, die funktioniert? ;)
Bink

5

Ich glaube, hier gibt es weitere Überlegungen, nach denen Sie möglicherweise nicht suchen. Hier gibt es zwei allgemeine Bedenken:

  • Lager
  • Suchen und Abrufen

Lager

Es gibt viele Meinungen darüber, warum Sie no-sql- oder RDBMS-Speicher für Ihre Daten verwenden sollten. Eines der wichtigsten Elemente, das wir für nützlich hielten, ist das einfache Definieren und Speichern von JSON-Objekten im Speicher, ohne sich um die Definition der vollständigen Struktur oder Beziehung zwischen verschiedenen Objekttypen kümmern zu müssen. Einige der anderen Gründe für die Verwendung einer NoSql-Datenbank wären die Möglichkeit zum automatischen Sharden von Daten, die standortbasierte Suche und die einfache Wartung. Es gibt viele gute NoSql-Datenbanken, ich persönlich bevorzuge MongoDB. Wenn Sie jedoch noch keine NoSql-Datenbank verwendet haben, gibt es eine bestimmte Lernkurve, während Sie lernen, Ihre Gedanken neu zu verknüpfen. Die meisten von uns verwenden RDBMS bereits seit einiger Zeit und es erfordert bewusste Anstrengungen, um diese Gewohnheit zu überwinden. Darüber hinaus möchten Sie Ihr Datenmodell im Laufe Ihrer Bemühungen überarbeiten und die Konzepte besser verstehen. Wenn die Fähigkeit zum Umgestalten oder Umgestalten keine Option für Ihr Projekt ist, würde ich vorschlagen, sich an das zu halten, was Sie bereits am besten kennen.

Suche

Wenn Sie beabsichtigen, eine verwendbare Suche durchzuführen, empfehle ich Ihnen dringend, eine spezielle Textsuchmaschine wie SOLR zu verwenden, um Ihre Suche durchzuführen. Die Textsuche ist langsam, und wenn Sie mehrere Shards haben, ist die Suche noch langsamer. SOLR unterstützt blitzschnelle Textsuchen, einschließlich gewichteter Suchparameter, standortbasierter Suche und vielem mehr. SOLR ist jedoch nicht als primärer Speicher Ihrer Daten geeignet. Dies bedeutet, dass Sie Mechanismen für das doppelte Einfügen und Aktualisieren sowohl Ihrer Primärdatenbank als auch Ihrer SOLR-Ebene erstellen müssen, wenn Sie Ereignisse hinzufügen oder aktualisieren. Außerdem müssen Sie die SOLR später aktualisieren, indem Sie alle veralteten / beendeten Ereignisse entfernen.

Obwohl dies eine Menge zusätzlicher Arbeit zu bedeuten scheint, werden Sie sich später für die Voraussicht bedanken, eine Volltextsuchmaschine zu verwenden. Keine der NoSql-Datenbanken oder RDBMS kommt der Leistung und Agilität von SOLR / Lucene nahe.


3

Erstens, wenn Sie es versuchen , Shop in einem beliebigen Speicher JSON - Daten , aber keine NoSQL Datenbank, würde ich auf jeden Fall entmutigen JSON zu verwenden. Wenn Sie Ihre Daten beispielsweise als JSON-Datei speichern, ist es äußerst langsam, sie zu öffnen, zu analysieren, zu durchlaufen usw.

Vor diesem Hintergrund kann ich Ihre Frage einschränken auf: Was sind die Vor- und Nachteile von NoSQL ? und RDBMS ? Und es wurde bereits tausendfach im Netz beantwortet.

Bezüglich Ihres Projekts können Sie natürlich auch NoSQL verwenden oder RDBMS verwenden . Was ich Ihnen jedoch generell empfehlen kann, ist, über den Tellerrand hinaus zu denken und nach den anderen weniger sichtbaren Faktoren zu suchen, die Ihnen bei der Entscheidung zwischen den beiden Optionen helfen könnten. Versuchen Sie herauszufinden, welche Option die Entwicklung beschleunigen könnte. Welches ist besser geeignet für die anderen Teammitglieder - wenn Sie kein einziger Entwickler sind. Wenn Sie dies verkaufen, welches ist billiger, einfacher und im Allgemeinen besser für Ihre Nicht-Entwickler-Kunden geeignet?

Auf diese Weise können Sie endgültig entscheiden, welchen Weg Sie einschlagen möchten. Andernfalls ist es sehr schwierig, anhand der angegebenen Informationen eine Entscheidung zu treffen, da beide Optionen recht gut passen könnten.


2

In den meisten Anwendungen gibt es Anforderungen an

  1. Geben Sie Daten ein, führen Sie eine Verarbeitung durch, speichern Sie die Daten, rufen Sie die Daten ab und fragen Sie die Daten ab. Möglicherweise müssen auch Berichte zu den Daten erstellt werden.
  2. Daten zwischen verschiedenen Teilen des Systems oder mit externen Systemen austauschen

Um die Anforderungen für Punkt 1 zu erfüllen, ist eine Methode zur Speicherung von Daten erforderlich. In der Regel kann eine einfache Dateistruktur verwendet werden, wenn das Datenvolumen sehr klein und der Datentyp einfach ist und keine umfangreichen Suchfunktionen erfordert. Wenn Daten komplexer werden, kann eine XML- (oder sogar JSON-) Struktur verwendet werden, bei der die Daten noch in Dateien gespeichert sind. Das Suchen wird jedoch problematischer. Wenn das Datenvolumen zunimmt und die Komplexität der Suche zunimmt, wird normalerweise eine Datenbank ausgewählt, die branchenübliche Methoden für die Persistenz, Abfrage usw. von Daten bietet. Die Datenbanken können große Datenmengen verarbeiten und die Daten schnell und effizient speichern, abrufen und durchsuchen .

Um die Anforderungen für Punkt 2 zu erfüllen, gibt es verschiedene Methoden zum Ermöglichen des Datenaustauschs zwischen Systemen, einschließlich XML, JSON usw.

Diese Methoden ermöglichen die Definition der Datenstruktur durch einen Benutzer und sind sprachunabhängig, sodass unterschiedliche Systeme Daten austauschen können.

In Ihrem speziellen Fall beschreibt JSON bei korrekter Verwendung eine Reihe von Musikereignissen. Sie können die Daten zwar im JSON-Format speichern, die Suche nach diesen Daten ist jedoch langsam und ineffizient, da die Anzahl der Musikereignisse zunimmt.

Bei Verwendung eines Ansatzes zur Trennung von Bedenken besteht der bessere Ansatz darin, die Daten zu sammeln, in einer Datenbank zu speichern, Ihre Abfrage basierend auf Benutzereingaben in der Datenbank auszuführen und die Ergebnisse dann im JSON-Format an den Client zurückzugeben, um die Daten anzuzeigen.

Ein weiteres Problem beim JSON-Ansatz ist eine sich ändernde Datenstruktur. Derzeit ist Ihre Struktur relativ einfach. Sie können diese Struktur für mehrere Monate verwenden, und dann wird ein zusätzliches Feld identifiziert. Was machen Sie dann mit all Ihren vorhandenen JSON-Objekten? Die Aktualisierung dieser wäre problematisch.

Wenn Sie eine Datenbank verwendet haben, ist das Hinzufügen eines zusätzlichen Felds relativ einfach und nur der Code zum Generieren der JSON muss an einer einzigen Stelle geändert werden, sodass Sie alle neuen JSON-Daten mit dem neuen Feld erhalten.

Kurz gesagt, verwenden Sie jede Technologie für das, was sie für JSON für den Datenaustausch und eine Datenbank für die Datenpersistenz entwickelt wurde.


0

Ich denke, Sie werden mit der Verwendung von NoSQL zum Speichern dieser Daten einen besseren Erfolg haben als mit SQL, da Sie Abfragen durchführen müssen.

Auch nur weil einige Daten rein relational sind, heißt das nicht mehr, dass sie in einem RDBMS (SQL) gespeichert werden müssen. Relationale IMO-Daten lassen sich besser in Graphendatenbanken übersetzen.

Natürlich können Sie die Abfragen auch in SQL schreiben, aber die Leistung wird aufgrund der Anzahl der Joins, die Sie benötigen, furchtbar (unter Berücksichtigung, dass Ihre Daten etwas normalisiert sind und nicht alle in einer Ereignistabelle).

Zusammenfassend lässt sich jedoch sagen, dass Sie durch die Verwendung von NoSQL (also JSON oder eines anderen von der Datenbank unterstützten Formats) mehr Freiheit haben, wenn Sie in Zukunft Ihr Schema ändern können, ohne bereits vorhandene Daten zu berücksichtigen.

Wenn Sie NoSQL in Betracht ziehen, können Sie auch in Diagrammdatenbanken nachsehen, wenn Sie sehr komplexe Abfragen verwenden möchten, da diese Ihnen Vorteile bieten, wenn Sie sie einfach erstellen und auch sehr schnell ausführen.


0

Ich denke, Sie sollten beides verwenden, und ich sehe es nicht als Versus-Entscheidung.

Eine relationale Datenbank ist sinnvoll, um Daten mit relationalen Eigenschaften schnell und effizient zu speichern und abzurufen.

JSON ist ein großartiges Datenformat, da es einfach, leicht und ideal für die Weitergabe von Rohdaten in einem sehr einfachen Format mit einer Syntax ist, die zum Speichern und Austauschen von Textinformationen geeignet ist. Es ist großartig, um kleine Datenmengen zwischen einem Browser und einem Server zu übertragen. Es ist nicht so einfach, relationale Datenabfragen zu starten.

Daher würde ich SQL für die Datenspeicherung und JSON für das Datentransportformat empfehlen.

Es ist richtig, dass es keine SQL-Schlüsselwertoptionen wie Mongo, Redis usw. gibt. Diese bieten den Vorteil einer möglicherweise einfacheren Zuordnung zum JSON-Format, sind jedoch in der Regel für Abfragen etwas schwieriger zu verwenden. Die größte Hürde dabei ist, dass die allgemeine IT-Community sich mit SQL nicht auskennt, das so gut bekannt ist und über eine Vielzahl von Ressourcen und Kenntnissen verfügt, die für nahezu jede erdenkliche Situation zur Verfügung stehen.


Wenn ich einen Programmierer mit einem guten Verständnis für die Verwendung der noSQL-Schlüsselwert-Speichermethode in Abfragen finden würde, würden Sie sagen, dass dies die größte Herausforderung für die Verwendung von JSON als Datenspeicherformat ist?
zgall1

Ich wette, es wäre einfach, weil die einzige Datenstruktur schlecht / schlechter als der Durchschnitt ist. Entwickler wissen, ist die relationale Datenbank. Hierbei geht es jedoch um die durchschnittliche Qualität von Entwicklern, und wie sie gelernt haben, um das Lernen zu vermeiden, wäre NoSQL die richtige Wahl für nicht relationale Daten. Tatsächlich ist es für Entwickler oft einfacher, vorausgesetzt, Ihre Daten sind wirklich nicht -relational. ABER Sie müssen die richtige Auswahl für die Datenbank treffen, NoSQL entscheidet über die ursprüngliche Auswahl und wie gut sie mit den Daten übereinstimmt.
JM Becker
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.