Wie würden Sie das design Ihrer Datenbank zu ermöglichen, Benutzer-definierten schema
Wenn Sie eine Anwendung erstellen, die wie - sagen wir mal eine blog-Anwendung, erstellen das Datenbankschema ist relativ einfach. Sie haben Tabellen zu erstellen, tblPosts, tblAttachments, tblCommets, tblBlaBla... und das ist es (ok, ich weiß, das ist ein bisschen vereinfacht, aber du verstehst, was ich meine).
Was ist, wenn Sie eine Anwendung haben, wo Sie zulassen möchten, dass Benutzer zu definieren, die Teile des Schemas zur Laufzeit. Angenommen, Sie möchten eine Anwendung erstellen, wo Benutzer sich anmelden können jede Art von Daten. Ein Benutzer anmelden möchte seine Arbeitszeit (startTime, endTime, Projekt-Id, Bezeichnung), der nächsten sammeln will, Kochrezepte, andere vielleicht Aktien-Kurse, das wöchentliche Gewicht Ihres Babys, die monatlichen Kosten Sie ausgegeben, für Lebensmittel, die Ergebnisse Ihrer Lieblings-Fußball-teams oder was auch immer-Sachen, die Sie denken kann.
Wie würden Sie entwerfen eine Datenbank für alle, die sehr sehr unterschiedliche Arten von Daten? Würden Sie erstellen ein generisches schema, das alle Arten von Daten, würden Sie neue Tabellen erstellen, reflektieren die Daten der Benutzer-schema oder haben Sie eine andere tolle Idee, das zu tun?
Falls es wichtig ist: ich habe mit SQL Server /Entity Framework
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lassen Sie uns versuchen Sie es erneut.
Wenn Sie wollen, dass Sie in der Lage sein, um Ihr eigenes schema, dann warum nicht bauen Sie das schema mithilfe von, oh, ich weiß, das CREATE TABLE-Anweisung. Haben Sie ein komplettes Schiff, voll funktionsfähige, leistungsstarke Datenbank, die erstaunliche Dinge tun kann wie definieren schemas und Daten zu speichern. Warum nicht verwenden es?
Wenn Sie nur einige ad-hoc-Eigenschaften, dann sicher.
Aber wenn es "carte-blanche, Sie können tun, was Sie wollen", dann lassen Sie Sie.
Müssen Sie wissen, SQL? Äääh, Nein. Das ist Ihre UIs Aufgabe. Ihr job als tool und application designer ist das verstecken der Implementierung vom Benutzer. So präsentieren Listen von Feldern, Linien und Pfeilen, die, wenn Sie wollen, Beziehungen etc. Was auch immer.
Leute haben seit "end-user", "einfache" Datenbank-tools für Jahre.
"Was, wenn Sie wollen, um eine Spalte hinzuzufügen?" Fügen Sie dann eine Spalte, Datenbanken zu tun, dass die meisten guten zumindest. Wenn nicht, erstellen Sie die neue Tabelle, kopieren Sie die alten Daten, löschen Sie die alte.
"Was, wenn Sie wollen, um eine Spalte zu löschen?" Siehe oben. Wenn Ihr nicht entfernen können Spalten, dann entfernen Sie es aus der logischen Sicht des Benutzers so wie es aussieht ist es gelöscht.
"Was ist, wenn Sie eleventy Milliarde Zeilen an Daten?" Dann haben Sie eine eleventy Million Zeilen von Daten und Operationen nehmen eleventy Milliarde mal mehr, als wenn Sie hatte 1 Zeile von Daten. Wenn Sie eleventy Milliarde Zeilen mit Daten, die Sie vermutlich nicht benutzen sollte Ihr system für diese sowieso.
Die Faszination von "die Implementierung von Datenbanken auf Datenbanken", entzieht sich mir.
"Ich habe Oracle hier, wie ich kann bieten weniger Funktionen und machen Sie langsamer ist für den user??"
Gee, Frage ich mich.
Gibt es keine Möglichkeit, vorherzusagen, wie Komplex Ihre Daten-Anforderungen gerecht wird. Entity-Attribut-Wert ist eine typische Lösung, die viele Programmierer verwenden, aber es könnte ausreichend sein, beispielsweise wenn der Benutzer die Daten konventionell modelliert und mit mehreren Tabellen.
Ich würde serialisieren des Benutzers benutzerdefinierte Daten als XML-oder YAML oder JSON oder ähnliche semi-strukturierten format, und speichern Sie in einer text-BLOB.
Können Sie selbst erstellen invertierte Indizes so kann man bestimmte Werte in den Attributen in Ihren BLOB. Sehen http://bret.appspot.com/entry/how-friendfeed-uses-mysql (die Technik funktioniert in jedem RDBMS, nicht nur MySQL).
Sich auch überlegen, ein Dokument speichern, wie Solr oder MongoDB. Diese Technologien müssen nicht entsprechen relationalen Datenbank-Konventionen. Sie können hinzufügen, neue Attribute zu jedem Dokument zur Laufzeit, ohne dass es zu einer Neudefinition der schema. Aber es ist ein Kompromiss -- ohne schema bedeutet, dass Ihre app kann jedoch nicht davon abhängen, Dokumente/Zeilen wird ähnlich wie in der gesamten Kollektion.
Ich bin ein Kritiker der Entity-Attribut-Wert-anti-pattern.
Habe ich geschrieben über die EAV Probleme in meinem Buch, SQL-Antipatterns: Vermeidung der Gefahren von Datenbank-Programmierung.
Hier ist eine SO beantworten, wo Liste ich einige Probleme mit der Entity-Attribut-Wert: "Product-Tabelle, viele Arten von Produkten, jedes Produkt hat viele Parameter."
Hier ist ein blog habe ich gepostet, den anderen Tag mit etwas mehr Diskussion des EAV Probleme: "EAV SCHEITERN."
Und sicher sein, um dieses blog zu Lesen "Schlechtes CaRMa" darüber, wie Sie versuchen, einen voll flexiblen Datenbank fast zerstört eine Gesellschaft.
Ich würde für ein Hybrid-Entity-Attribute-Value-Modell, so wie Antony ' s Antwort, Sie haben die EAV-Tabellen, aber Sie haben auch Standard-Spalten (Eigenschaften der Klasse), die immer vorhanden ist.
Hier ein tolle Artikel auf, was du machst 🙂
Als einen weiteren Kommentar, ich klopfte ein Prototyp für diesen Ansatz mit Linq2Sql in ein paar Tagen, und es wurde eine brauchbare Lösung. Da Sie erwähnt haben, Entity Framework, ich würde werfen Sie einen Blick auf version 4 und deren POCO-Unterstützung, da wäre dies ein guter Weg, um zu injizieren, ein hybrid-EAV-Modell ohne umweltschädliche Ihre EF-schema.
Auf der Oberfläche, ein schema-weniger oder Dokument-orientierte Datenbank wie CouchDB oder SimpleDB für die benutzerdefinierten Daten klingt ideal. Aber ich denke, das hilft nicht viel, wenn Sie nicht alles benutzen aber SQL und EF.
Ich bin nicht vertraut mit dem Entity Framework, aber ich würde lehnen in Richtung der Entity-Attribut-Wert (http://en.wikipedia.org/wiki/Entity-Attribute-Value_model) Datenbank-Modell.
So, anstatt das erstellen von Tabellen und Spalten, auf die Fliegen, die Ihre app schaffen würde, die Attribute (oder Sammlungen von Attributen) und dann Ihre Endbenutzer vollständig wäre die Werte.
Aber, wie gesagt, ich weiß nicht, was das Entity Framework soll für Sie tun, und kann es nicht lassen, Sie nehmen diesen Ansatz.
Nicht so eine kritische Bemerkung, aber es kann helfen, sparen Sie Ihre Zeit darauf hin, dass dies einer von denen "Don Quixote" Heiligen Gral geben Sie Probleme. Es ist eine ewige Suche nach wahrscheinlich über 50 Jahre, um eine benutzerfreundliche Datenbank-design-Schnittstelle.
Nur quasi-erfolgreichen, diejenigen, die gewonnen haben alle erhebliche Zugkraft, die ich denken kann, sind 1. Excel (und seine Vorgänger), 2. Filemaker - (das original, nicht seinen aktuellen Geschmack), und 3. (möglicherweise, aber zweifelnd) Zugreifen. Beachten Sie, dass die ersten zwei sind beschränkt im Grunde eine Tabelle.
Ich würde überrascht sein, wenn unsere kollektive konventionelle Weisheit wird Ihnen helfen, brechen die Barriere. Aber es wäre wunderbar.
Eher als re-implementieren sqlservers "CREATE TABLE" - Anweisung, die gemacht wurde vor vielen Jahren von einem team von Programmierern, die waren wohl besser als du oder ich, warum nicht arbeiten auf Verfügbarmachen von SQLSERVER in einer begrenzten Art und Weise, um die Benutzer-lassen Sie erstellen Ihr eigenes schema in einer begrenzten Art und Weise und nutzen Sie die power von SQLServer, es richtig zu machen.
Ich würde nur geben Sie eine Kopie von SQL Server Management Studio, und sagen, "go nuts!" Warum neu erfinden ein Rad innerhalb eines Rades?
Schauen Sie sich dieses post Sie können es tun, aber es ist eine Menge harter Arbeit 🙂 Wenn die Leistung ist kein Problem, eine xml-Lösung könnte auch funktionieren aber das ist auch eine Menge Arbeit.