5 Stimmen

Designwahl für eine vom Benutzer anpassbare Datenstruktur?

Ich plane, eine Anwendung zu erstellen, die es dem Benutzer ermöglichen muss, sein eigenes Datenmodell dynamisch einzurichten (d. h. Felder, Datenstruktur usw. zu erstellen).

Ich stehe vor mehreren technischen Möglichkeiten, die alle Nachteile haben:

  1. in den Verwaltungsbildschirmen, aktualisieren Sie das SQL-Schema der DB, um die Änderungen zu berücksichtigen.
    • Ich befürchte, dass dies eine sehr schlechte Idee ist, da die Anwendung über die entsprechenden Berechtigungen für die DB verfügen muss. Darüber hinaus, wenn jeder Klick ein neues SQL-Schema angewendet werden muss, kann ich mir vorstellen, dass ich direkt auf ein Loch laufen werde. Dies ist der Ansatz, den ich bei den meisten vom Benutzer anpassbaren Anwendungen gesehen habe.
  2. im DB-Schema eine Reihe generischer zusätzlicher Spalten erstellen und hoffen, dass es genügend Spalten für die komplexen Datenmodelle gibt.
    • dies kann schnell zu einer funktionalen Einschränkung werden, wenn ich nicht mehr als X Spalten in meiner Anwendung zulassen kann
  3. in einer einzigen Tabelle alle Elemente mit einer ID-Spalte und einer Xml-Spalte zur Speicherung der benutzerdefinierten Spalten speichern.
    • Dieser Ansatz kann die zuvor erwähnten Nachteile beseitigen, da das Sql-Schema statisch bleibt, aber da EF (das ich hoffte, verwenden zu können) nicht weiß, wie Xml-Datentyp zu verwalten, muss ich am Ende entweder mit manuellen SqlCommand mit XML-Funktion, oder das Schreiben eines benutzerdefinierten EF-Anbieters, die ich mir vorstellen, ziemlich viel Arbeit sein wird.
    • Dies ist der Ansatz, den Microsoft für SharePoint gewählt hat... das lässt mich glauben, dass es der bessere ist (oder zumindest der weniger schlechte)
  4. eine Tabelle "Eigenschaften" mit einer itemId-Spalte, einer Spalte für den Eigenschaftsnamen und einer Spalte für den Eigenschaftswert erstellen
    • dieser Ansatz impliziert eine sehr große Tabelle (X Einträge * Y Eigenschaften pro Eintrag)
    • Ich muss meine Werte im Klartext speichern, auch wenn es sich zum Beispiel um Zahlen handelt.

Meine Anforderungen sind:

  • den Code wartbar und testbar halten und alle gängigen Techniken anwenden
  • eine reaktionsschnelle Anwendung mit großen Datenmengen haben
  • eine möglichst sichere Anwendung haben
  • den Benutzern die Möglichkeit geben, ihre Anwendung vollständig anzupassen (benutzerdefinierte Ansicht mit Filter/Sortierung nach Benutzereigenschaften erstellen).

Ich bin der Meinung, dass die Wahl des richtigen Designs jetzt die richtige sein muss, denn es wäre sehr schwer, dieses zu ändern.

Für jede Rückmeldung wären wir dankbar

3voto

AdaTheDev Punkte 135097

Eine Möglichkeit wäre die Verwendung einer NoSQL-Datenbank wie MongoDB, die ohne Schema arbeitet. Neue Felder müssen nicht im Voraus definiert werden (keine Kopfschmerzen bei der Schemaänderung) und verschiedene Datensätze können unterschiedliche Felder haben. Dies ist einer der Vorteile eines NoSQL-Speichers wie diesem.

z.B. in Mongo, Ihre "Tabelle" könnte diese 2 Datensätze innerhalb in legimitely haben:

{
    "ID" : 1,
    "FirstName" : "Joe",
    "LastName" : "Bloggs",
    "FavouriteColour" : "Blue"
}

{
    "ID" : 2,
    "FirstName" : "John",
    "LastName" : "Smith",
    "DOB" : "2000-01-01"
}

Das Hinzufügen eines neuen Feldes ist so einfach wie das Einfügen in Datensätze.

Meiner Erfahrung nach kann ein vollständig flexibles/dynamisches Schema in einem RDBMS wie SQL Server etwas mühsam und schwierig sein, um eine hohe Leistung zu erzielen. Ich habe Erfahrungen mit den von Ihnen genannten Optionen 1) und 3) gemacht. Wenn die Daten als XML gespeichert wurden, musste ich sie für bestimmte Zwecke in der Regel ohnehin in eine relationale Form umwandeln.

2voto

Phil Helmer Punkte 1220

Es muss gesagt werden, dass alles, was jemand mit voller Leistung macht, nicht zu 100 % realistisch ist.

In der Annahme, dass Sie eine relationale Datenbank verwenden, würde ich mich für Option 1 entscheiden. Sie haben immer noch die Möglichkeit, die Vorteile des Speicherdesigns zu nutzen, das ein RDBMS schnell macht. Sie könnten Ihr Sicherheitsrisiko verringern, indem Sie gespeicherte Prozeduren verwenden, um Ihre DDL-Änderungen vorzunehmen, und die Ausführungsrechte für diese SPs einschränken.

Option 2 ist möglich, aber es könnte zu Wartungsproblemen führen, wenn man versucht herauszufinden, ob die Widgetfarbe in UDFText39 oder UDFText52 gespeichert ist.

"Große Datenmengen" scheinen Option 3 auszuschließen, es sei denn, Sie entscheiden sich für eine nicht-relationale Lösung. In einem RDBMS wäre das ziemlich langsam.

Option Nr. 4 ist eine rundum schlechte Idee, da Sie gezwungen sind, nicht nur Datenbereiche (Farben, Größen usw.), sondern auch Datentypen zu mischen. Halten Sie sich von dieser Option fern.

0voto

fixagon Punkte 5416

Ich würde sagen, dass die sauberste Lösung die Nummer 4 wäre.

Erstellen Sie eine Tabelle für jeden Datentyp, den Sie verwenden möchten. - Zahlenwert - Stringwert - datetime-Wert - ...

damit Sie nicht eine unglaublich große Tabelle haben und gleichzeitig stark getippt sind. einzige Einschränkung: Sie sind auf eine bestimmte Anzahl von unterstützten Datentypen beschränkt, aber das ist IMHO eine natürliche Einschränkung.

0voto

MattDavey Punkte 8611

Es sieht so aus, als wäre dies ein guter Kandidat für das EAV-Muster (Entitätsattributwert), das einer der von Ihnen beschriebenen Optionen ähnelt.

Entität Attribut Wert Muster.

Für weitere Lektüre auf einer etwas konzeptionelleren Ebene können Sie diesen Artikel lesen > Attribut-Wert-System .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X