Wie wird eine generische Datenbank entworfen, deren Layout sich im Laufe der Zeit ändern kann?

8

Hier ist ein kniffliger - wie programmiere ich programmatisch eine Datenbank, deren Inhalt ich nicht wirklich vorhersehen kann?

Ich implementiere ein generisches Eingabeformularsystem. Der Benutzer kann PHP-Formulare mit einem WYSIWYG-Layout erstellen und sie für beliebige Zwecke verwenden. Er kann auch die Eingabe abfragen.

Also, wir haben drei Phasen:

  1. ein Formular wird entworfen und generiert. Dies ist ein einmaliger Vorgang, obwohl das Formular später bearbeitet werden kann. Dies entwirft die Datenbank.
  2. Einige oder mehrere Personen nutzen das Formular - etwa für tägliche Verkaufsberichte, Lagerverwaltung, Gehaltsabrechnung usw. Ihre Eingabe in die Formulare wird in die Datenbank geschrieben.
  3. andere, vielleicht das Management, können die Datenbank abfragen und Berichte generieren.

Da diese Formulare generisch sind, kann ich die Datenbankstruktur nicht vorhersagen - abgesehen davon, dass sie HTML-Formularfelder widerspiegelt und aus den Daten besteht, die aus der Sammlung von Eingabefeldern, Memos, Optionsfeldern und ähnlichem eingegeben werden.

Fragen und Anmerkungen:

A) Wie kann ich die Datenbank in Bezug auf Tabellen und Spalten am besten strukturieren? Was ist mit Primärschlüsseln? Mein erster Gedanke war, den Kontrollnamen zu verwenden, um jede Spalte zu identifizieren, dann erkannte ich, dass der Benutzer das Formular bearbeiten und umbenennen kann, so dass "Name" zu "Mitarbeiter" oder "Lohn" zu ": Gehalt" wird. Ich lehne mich an eine eindeutige Nummer für jeden.

B) Wie kann man die Zeilen am besten markieren? Ich dachte an einen Zeitstempel, um eine Abfrage zu machen, und eine Spalte für die Zeilen-ID aus A)

C) Ich muss Spalten umbenennen / einfügen / löschen. Feindlöschung, ich bin mir nicht sicher, ob ich die Daten aus der Datenbank lösche. Selbst wenn der Benutzer sie nicht mehr aus dem Formular eingibt, möchte er möglicherweise abfragen, was zuvor eingegeben wurde. Oder es können einige rechtliche Anforderungen für die Aufbewahrung der Daten bestehen. Irgendwelche Fehler in der Spalte umbenennen / einfügen / löschen?

D) Für die Abfrage kann ich meine PHP die Datenbank abfragen lassen, um Spaltennamen zu erhalten und ein Formular mit einer Liste zu erzeugen, wobei jeder Eintrag einen Datenbankspaltennamen hat, ein Ankreuzfeld, um anzugeben, ob er in der Abfrage verwendet werden soll , basierend auf dem Spaltentyp, einige Auswahlkriterien. Das sollte ausreichen, um Suchanfragen wie "position = 'senior salesman' und salary & gt; 50k" zu erstellen.

E) Ich muss wahrscheinlich einige ausgefallene Diagramme erstellen - Diagramme, Histogramme, Kreisdiagramme usw. für Abfrageergebnisse numerischer Daten im Zeitverlauf. Ich muss dafür ein gutes FOSS PHP finden.

F) Was habe ich noch vergessen?

Das alles scheint mir sehr schwierig, aber ich bin Datenbank n00b - vielleicht ist es einfach für Sie Gurus?

Edit: Bitte sag mir nicht, es nicht zu tun. Ich habe keine Wahl: - (

Edit: Im wirklichen Leben erwarte ich nicht, dass die Spalten umbenennen / einfügen / löschen häufig ist. Es ist jedoch möglich, dass nach einigen Monaten eine Änderung der Datenbank erforderlich ist. Ich bin sicher, das passiert regelmäßig. Ich fürchte, dass ich diese Frage schlecht formuliert habe und dass die Leute denken, dass alle zehn Minuten Änderungen vorgenommen werden.

Realistisch gesehen werden meine Benutzer beim Erstellen des Formulars eine Datenbank definieren. Sie könnten es beim ersten Mal richtig machen und es nie ändern - besonders wenn sie von Papierformularen konvertieren. Selbst wenn sie sich dazu entschließen, sich zu ändern, kann dies nur einmal oder zweimal vorkommen, nach Monaten oder Jahren - und das kann in jeder Datenbank passieren.

Ich glaube nicht, dass ich hier einen Sonderfall habe oder dass wir uns auf Veränderungen konzentrieren sollten. Vielleicht besser, sich auf die Verknüpfung zu konzentrieren - was ist ein gutes Primärschlüssel-Schema? Sagen Sie vielleicht, für eine Texteingabe, eine numerische und eine Notiz?

    
Mawg 10.06.2010, 02:19
quelle

8 Antworten

8
  

"Das alles erscheint mir sehr schwierig, aber   Ich bin Datenbank n00b - vielleicht ist es   einfach für dich Gurus? "

Nein, es ist wirklich heikel. Grundsätzlich ist das, was Sie beschreiben, keine Datenbankanwendung, sondern eine Datenbankanwendung Builder . In der Tat klingt es so, als ob Sie etwas wie Google App Engine oder eine Web-Version von MS Access codieren möchten. Schreiben eines solchen Tools wird viel Zeit und Know-how kosten.

Google hat flexible Schemas unter Verwendung seiner BigTable-Plattform implementiert. Es erlaubt Ihnen, das Schema ziemlich beliebig zu biegen. Der Cause ist, diese Flexibilität macht es sehr schwierig, Abfragen wie "Position = 'Senior Salesman' und Gehalt & gt; 50k" zu schreiben.

Ich glaube also nicht, dass der NoSQL-Ansatz das ist, was Sie brauchen. Sie möchten eine Anwendung erstellen, die RDBMS-Schemas generiert und verwaltet. Das bedeutet, dass Sie ein Metadaten-Repository entwerfen müssen, aus dem Sie dynamisches SQL generieren können, um die Schemas der Benutzer zu erstellen und zu ändern und auch das Frontend zu generieren.

Dinge, die Ihr Metadatenschema speichern muss

Für Schema-Generierung:

  • Fremdschlüsselbeziehungen (ein MITARBEITER arbeitet in einer ABTEILUNG)
  • eindeutige Geschäftsschlüssel (es kann nur ein DEPARTMENT namens "Sales" geben)
  • Referenzdaten (erlaubte Werte von EMPLOYEE.POSITION)
  • Spalte Datentyp, Größe usw.
  • ob die Spalte optional ist (d. h. NULL oder NOT NULL)
  • komplexe Geschäftsregeln (Mitarbeiterboni dürfen 15% ihres Gehalts nicht übersteigen)
  • Standardwert für Spalten

Für die Front-End-Generierung

  • zeigt Namen oder Bezeichnungen an ("Löhne", "Gehalt")
  • Widget (Dropdown-Liste, Popup-Kalender)
  • versteckte Felder
  • abgeleitete Felder
  • Hilfetext, Tipps
  • clientseitige Validierung (assoziiertes JavaScript usw.)

Das weist auf die potentielle Komplexität in Ihrem Vorschlag hin: Ein gewöhnlicher Formulardesigner wie Joe Soap wird nicht in der Lage sein, das JS zu formulieren, um zu bestätigen, dass ein Eingabewert zwischen X und Y liegt Ich werde es mit Hilfe von Vorlagen ableiten müssen.

Das sind keine erschöpfenden Listen, es ist nur von meinem Kopf.

Für Primärschlüssel empfehle ich, eine Spalte mit GUID-Datentyp zu verwenden. Es ist nicht garantiert, dass Zeitstempel eindeutig sind. Wenn Sie Ihre Datenbank jedoch auf einem Betriebssystem ausführen, das an sechs Stellen läuft (d. H. Nicht in Windows), ist es unwahrscheinlich, dass es zu Konflikten kommt.

letztes Wort

  

'Mein erster Gedanke war es, die   Kontrollname, um jede Spalte zu identifizieren,   dann habe ich festgestellt, dass der Benutzer bearbeiten kann   die Form und umbenennen, so dass vielleicht   "Name" wird "Angestellter" oder "Lohn"   wird ": Gehalt". Ich lehne mich an   auf eine eindeutige Nummer für jeden. "

Ich habe vorher Datenbankschema-Generatoren erstellt. Sie sind schwer. Eine Sache, die schwierig sein kann, ist das Debuggen des dynamischen SQL. Machen Sie es sich also leichter: Verwenden Sie echte Namen für Tabellen und Spalten. Nur weil der App-Benutzer jetzt ein Formular mit dem Titel HEADCOUNT sehen möchte, heißt das nicht, dass Sie die Tabelle EMPLOYEES umbenennen müssen. Daher muss das angezeigte Label vom Schemaobjektnamen getrennt werden. Andernfalls werden Sie herausfinden, warum diese generierte SQL-Anweisung fehlgeschlagen ist:

%Vor%

So liegt der Wahnsinn.

    
APC 10.06.2010, 03:54
quelle
7

Sie fragen im Grunde, wie Sie eine Anwendung ohne Spezifikationen erstellen können. Relationale Datenbanken wurden nicht so konzipiert, dass Sie dies effektiv tun können. Der übliche Ansatz für dieses Problem ist ein Entity-Attribute-Value-Design und für die Art des Systems, in dem Sie es verwenden möchten, sind die Chancen des Scheiterns fast 100%.

Es macht beispielsweise keinen Sinn, dass die Spalte namens "Name" zu "Gehalt" wird. Wie würde ein Bericht, wo Sie das gesamte Gehalt arbeiten möchten, wenn die Gehaltswerte "Fred", "Bob", 100K, 1000, "viel" haben könnten? Datenbanken waren nicht darauf ausgelegt, irgendjemand irgendwohin zu bringen. Erfolgreiche Datenbankschemata erfordern eine Struktur, die Aufwand in Bezug auf Spezifikationen bedeutet, was zu speichern ist und warum.

Um Ihre Frage zu beantworten, würde ich daher das Problem überdenken. Der gesamte Ansatz, eine App zu erstellen, die alles im Universum speichern kann, ist kein Erfolgsrezept.

    
Thomas 10.06.2010 02:29
quelle
2

Wie Thomas sagte, rationale Datenbank ist nicht gut für Ihr Problem. Vielleicht möchten Sie jedoch NoSQL dbs wie MongoDB betrachten.

    
Codism 10.06.2010 02:40
quelle
2

Siehe diesen Artikel: Ссылка für jemandes Erfahrung Ihres Problems.

    
Mark Bannister 10.06.2010 10:56
quelle
1

Dies ist für A) & amp; B), und ist nicht etwas, was ich getan habe, sondern dachte, es wäre eine interessante Idee, die Reddit verwendet, siehe diesen Link (siehe Lektion 3 ):

Ссылка

    
Kerry Jones 10.06.2010 02:28
quelle
1

Nicht sicher über die Datenbank, aber für Diagramme, anstatt PHP für die Diagramme zu verwenden, empfehle ich, mit Javascript ( Ссылка ). Vorteile davon sind, dass einige der Prozesse auf die Client-Seite für Diagramm-Anzeigen ausgelagert werden und sie können interaktiv sein.

    
xamox 10.06.2010 02:29
quelle
1

Die anderen Befragten haben Recht, dass Sie mit diesem Ansatz sehr vorsichtig sein sollten, weil er komplexer und weniger leistungsfähig ist als das traditionelle relationale Modell - aber ich habe diese Art von Maßnahmen getroffen, um Abteilungsunterschiede bei der Arbeit auszugleichen gut für den Umfang der Nutzung.

Im Grunde stelle ich es so auf, zuerst - eine Tabelle, um einige Informationen über das Formular zu speichern, das der Benutzer erstellen möchte (natürlich, wie Sie es brauchen):

%Vor%

Dann eine Tabelle, um die Felder zu definieren, die auf dem Formular einschließlich irgendwelcher Grenzen präsentiert werden sollen und die Reihenfolge und die Seite, die sie präsentiert werden sollen (meine App präsentierte die Felder als a mehrseitigen Assistenten Art des Flusses).

-

%Vor%

Dann würde mein Perl-Code die Felder in der Reihenfolge für Seite 1 durchlaufen und sie auf das "Wizard-Formular" setzen ... und der "Nächste" -Button würde die Seite 2-Felder in der Reihenfolge usw. anzeigen.

Ich hatte JavaScript-Funktionen, um die für jedes Feld festgelegten Grenzen zu erzwingen ...

Dann eine Tabelle, die die von den Benutzern eingegebenen Werte enthält:

%Vor%

Das wäre ein guter Ausgangspunkt für das, was Sie tun möchten, aber behalten Sie die Leistung im Auge, da sie Berichte wirklich verlangsamen kann, wenn sie 1000 benutzerdefinierte Felder hinzufügen. : -)

    
Ron Savage 10.06.2010 04:06
quelle
1

Ich stimme Mark zu, andere Erfahrungen zu nutzen kann viele unvorhergesehene Fehler verhindern, besonders für "Datenbank N00B", siehe dieser Artikel von einem Kerl arbeitet in einer Firma , die auf generisches Backend spezialisiert ist

    
eelis 03.11.2013 20:49
quelle