Vom Benutzer erstellte Datenbankstruktur: nicht relationale oder relationale Datenbanken?

8

Ich möchte dynamische Felder in meinen Datenbanksätzen haben.

Zum Beispiel: Ich möchte eine Anwendung erstellen, damit Benutzer ihre eigenen Formulare erstellen können.

Ein Benutzer könnte die folgenden Formulare erstellen:

Persönliches Profil:

  • Vollständiger Name
  • Straße
  • Arbeit
  • Telefon
    • Startseite
    • Arbeit
    • Mobil
  • Interessen
    • Interesse 1
    • Interesse 2
    • Interesse 3

Arbeit:

  • Vorname
  • Nachname
  • Arbeit
    • Abteilung
      • Spezialität 1
      • Spezialität 2
    • Abteilung
      • Spezialität 1
      • Spezialität 2

Länder:

  • Vereinigte Staaten
    • Staaten
      • New York
        • Städte
          • New York
          • Foo
      • Alabama
        • Städte
          • Bar
          • Baz

Wie Sie sehen, ist dies eine sehr dynamische Struktur:

  • Keine vordefinierte Anzahl von Feldern
  • Keine vordefinierten Feldnamen
  • Benutzer erstellt die Struktur der Datenbank

Also frage ich mich, was ist die beste Datenbank dafür: relational (mysql / postgresql) oder nicht-relational wie mongodb / couchdb / cassandra oder sogar XML-Datenbanken wie xindice?

Und selbst wenn ich dafür nicht-relationale Datenbanken wähle, wäre es klug, sicherheitsrelevante Informationen wie Kunden- und Rechnungsinformationen darauf zu speichern?

Ich habe Leute sagen hören, dass, wenn Ihre Informationen Einzigartigkeit erfordern, dann verwenden Sie relationale Datenbank. "Wir wollen nicht riskieren, unsere Kunden doppelt zu belasten". Welche Probleme in nicht-relationalen Datenbanken bedeuten sie eigentlich? Können Sie keine eindeutigen Daten in nicht-relationalen Datenbanken speichern?

Eine andere Sache, über die ich nachgedacht habe: Wird das Speichern von Daten in nicht-relationalen Datenbanken bedeuten, dass ich doppelte Einträge habe?

Betrachten Sie dieses Beispiel:

Kategorien:

  • Büro

    • Anwendungen
      • Textmate
        • Autor: Foobar
        • Preis: 120
      • Foo
        • Autor: Foobar
        • Preis: 120
  • Büro

    • Anwendungen
      • Textmate
        • Autor: Foobar
        • Preis: 120
      • Bar
        • Autor: Foobar
        • Preis: 120

Wie Sie sehen, gibt es Situationen für identische Einträge. Wie gehen nicht-relationale Datenbanken damit um? Ich bin so an relationale Datenbanken gewöhnt.

Ich fasse meine Fragen zusammen:

  • Welche Art von Datenbank für von Benutzern erstellte Datenbankstruktur?
  • Sind nicht-reale Datenbanken zum Speichern sicherheitskritischer Informationen?
  • Wie gehen nicht-reale Datenbanken mit Duplikaten um?
never_had_a_name 23.08.2010, 04:45
quelle

3 Antworten

3

Ich empfehle Ihnen dringend, CouchDB dafür auszuprobieren.

  1. Sie kommunizieren mit CouchDB über eine einfache REST-API. Mit anderen Worten, es ist " Made des Webs" und nicht nur eine Backend-Datenbank wie MongoDB und andere. CouchDB kann die Formulare tatsächlich bedienen und Einreichungen erhalten, da ein eingebauter Webserver vorhanden ist.
  2. Da es sich um einen JSON-Dokumentenspeicher handelt, eignet es sich gut zum Speichern strukturierter Daten. (Formulare und ihre Eingaben sind wirklich Dokumente und es macht mehr Sinn, sie so zu modellieren, IMO.)
  3. Sie können problemlos ein JSON-Dokument speichern, das jedes Webformular im selben "Bucket" wie die Formulareinreichungen beschreibt. (CouchDB kann sogar POSTs analysieren und sie in JSON-Dokumente umwandeln, wie Sie es für richtig halten. Beispielsweise ist es einfach, Zeitstempel für Formulareinreichungen zu haben.)
  4. Sie könnten eine so genannte "show" -Funktion schreiben, um den HTML-Code jedes Formulars in CouchDB zu generieren. Überprüfen Sie auch "_update" und Validierungsfunktionen.
  5. Es hat die Sicherheitsfunktionen, die Sie benötigen würden.
  6. Dokumentkonflikte können leicht identifiziert werden. Noch besser, CouchDB bestimmt automatisch eine "gewinnende" Version des Dokuments, aber Sie haben weiterhin Zugriff auf die "verlierenden" Dokumentversionen (bis Sie CouchDB sagen, die Datenbank zu komprimieren, wodurch alte Revisionen entfernt werden.)
    • Was die Eindeutigkeit angeht: Anstatt dass CouchDB eindeutige doc_ids generiert, sollten Sie eine _id zuweisen, die wirklich eine eindeutige Formularübergabe darstellt. Wenn jeder Benutzer nur eine Einreichung pro Formular zulassen soll, verwenden Sie für jedes JSON-Dokument, das aus einer Formularübergabe erstellt wurde, etwas in diese Richtung: submission:user:5:form:a3df2a712

Mit CouchDB können Sie das Problem vermeiden, dynamisch eindeutige Tabellen für jedes Formular zu erstellen, das ein Benutzer erstellen könnte.

    
Ben Damman 23.08.2010, 18:50
quelle
2

Wenn Ihre Daten dem relationalen Modell sehr gut entsprechen, Sie aber einige dynamisch formatierte Daten speichern müssen, die nicht riesig sind, werden Sie wahrscheinlich besser JSON, XML oder Ähnliches in einer Spalte speichern. Obwohl Sie dadurch einige Vorteile der erstklassigen SQL-Typisierung verlieren (Indizierung, Überprüfung von Fremdschlüsseleinschränkungen, Typprüfung usw.), eignet es sich gut zum Speichern dynamisch strukturierter Dokumente, wenn Ihre Abfragen sich nicht um ihre Interna kümmern.

Wenn Sie daran interessiert sind, hauptsächlich relationale Daten mit einem Hauch von JSON / XML / etc. zu speichern, empfehle ich PostgreSQL. PostgreSQL hat einen XML-Datentyp, aber ich empfehle es nicht, da ich XML hasse: P. Niemand hält Sie davon ab, JSON in einem TEXT-Feld zu speichern, aber PostgreSQL wird bald einen JSON-Datentyp mit unterstützenden Funktionen haben. Das hstore Contrib-Modul bietet eine effiziente Möglichkeit zum Speichern von Schlüssel / Wert-Paaren und bietet außerdem Textindex-Unterstützung.

Obwohl das Verschieben von JSON oder ähnlichem in eine SQL-Datenbank-Spalte gegen das relationale Modell gerichtet ist, ist es normalerweise besser, es trotzdem zu tun (wenn es Sinn macht!). Andernfalls müssen Sie das gesamte Schema Ihrer Anwendung der Datenbank erklären, was zu einer Menge SQL- und Datenbank-Mapping-Code führt, der wirklich nichts bewirkt.

    
Joey Adams 23.08.2010 05:50
quelle
-1

Die zu wählende Datenbank hängt mehr davon ab, was und wie Sie etwas mehr abfragen möchten als das, was Sie speichern möchten. Alle DBs können Sie speichern, was Sie wollen.

RDBMS eignen sich besonders gut für die Abfrage basierend auf dem relationalen Modell, und zwar relativ willkürlich. Durch Ad-hoc-Filter und Joins können Sie alle Arten von Magie ausüben.

Die NOSQL-DBs neigen dazu, bei ihren Abfragen weniger flexibel zu sein, aber sie sind auch bei anderen Aufgaben gut (beispielsweise arbeiten sie besser mit "unstrukturierten" Daten).

In Anbetracht dessen, was Sie hier gepostet haben, verwende ich einfach eine SQL-Datenbank und definiere die Tabellen so, wie der Benutzer sie definiert haben möchte. Richten Sie die Indizes ein, richten Sie die Abfragen ein. Klingt für mich wie ein echter Klacks. SQL-DBs behandeln all diese "Definitionsfelder im Handumdrehen" praktisch, weil ... das ist, was sie tun. Also benutz das.

    
Will Hartung 23.08.2010 05:25
quelle