Datenbank mit XML beschreiben

SQL, Dateimanagement - Sprachunabhängige Datenhaltung
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Datenbank mit XML beschreiben

Beitrag von Glocke » So Mai 12, 2013 5:05 pm

Hi, gibt es eine Möglichkeit eine relationale Datenbank mittels XML zu beschreiben, so dass aus der XML dann Code generiert werden könnte? D.h. z.B. folgende Beschreibung:

Code: Alles auswählen

<?xml version="1.0" ?>
<database host="localhost" user="myuser" pass="mypass" db="mydb">
    <table name="user">
        <column ident="name" type="string" size="50" />
        <column ident="email" type="string" size="50" />
        <column ident="password" type="string" size="50" />
        <column ident="salt" type="string" size="50" />
        <column ident="last_login" type="integer" autovalue="timestamp" />
        <column ident="last_ip" type="string" autovalue="ip" />
    </table>
    <table name="message">
        <column ident="title" type="string" size="100" />
        <column ident="content" type="strings" size="10000" />
        <column ident="author" type="foreign" target="user" nullable="no" />
    </table>
</database>
Und dann werden zwei PHP-Klasse (user, message) generiert, mir denen man (mittels gekapselten SQL-Befehlen) auf die Datenbank zugreifen kann? (z.B. öffentliche attribute und dazu insert, select, delete und update Methoden).

Aktuell bastle ich an einem Python-Skript, das anhand so einer XML-Datei PHP-Code generiert.. Falls es so etwas schon gibt, bräuchte ich das Skript nicht so umzuschreiben, dass es auch C++-Code erzeugt :D

Effektiv will ich mit einer relationen Datenbank (in meinem Fall mit einer MySQL-DB) kommunizieren, ohne mich "lowlevel" der SQL zu bedienen. Ich kann SQL, will das aber quasi kapseln.. Btw erzeugt das Skript Code der Prepared Statements durchführt. Das händisch zu machen ist mir ehrlich gesagt zu blöd :D (d.h. ich bin zu faul dazu und baue mir lieber ein Skript ^^)

LG Glocke

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8485
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Datenbank mit XML beschreiben

Beitrag von Xin » So Mai 12, 2013 9:54 pm

Glocke hat geschrieben:Hi, gibt es eine Möglichkeit eine relationale Datenbank mittels XML zu beschreiben, so dass aus der XML dann Code generiert werden könnte? D.h. z.B. folgende Beschreibung:
XML ist aber nicht SQL. XML ist die Darstellung von Daten, also INSERT INTOs oder das Ergebnis von SELECT.

Aber wie möchtest Du ein SELECT in XML ausdrücken? Das wäre natürlich möglich, aber das ein anderes XML-Format.

Das hast Du ja bereits beschreiben: Es beschreibt Befehle, in Deinem Fall die CREATE TABLE-Befehle.
Glocke hat geschrieben:Effektiv will ich mit einer relationen Datenbank (in meinem Fall mit einer MySQL-DB) kommunizieren, ohne mich "lowlevel" der SQL zu bedienen. Ich kann SQL, will das aber quasi kapseln.. Btw erzeugt das Skript Code der Prepared Statements durchführt. Das händisch zu machen ist mir ehrlich gesagt zu blöd :D (d.h. ich bin zu faul dazu und baue mir lieber ein Skript ^^)
Wo kommen die XML-Befehle denn her?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3081
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Datenbank mit XML beschreiben

Beitrag von cloidnerux » So Mai 12, 2013 10:11 pm

Ist das nicht eine Typische Fragestellung à la "Was für Daten habe ich und was soll daraus werden"?
Wenn du für dich selber weist, wie du deine XML-Daten in SQL-Befehle umbauen willst, dann kannst du das doch auch implementieren?
Redundanz macht wiederholen unnötig.
quod erat expectandum

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Datenbank mit XML beschreiben

Beitrag von Glocke » Mo Mai 13, 2013 9:54 am

cloidnerux hat geschrieben:Ist das nicht eine Typische Fragestellung à la "Was für Daten habe ich und was soll daraus werden"?
Wenn du für dich selber weist, wie du deine XML-Daten in SQL-Befehle umbauen willst, dann kannst du das doch auch implementieren?
Hast du mein Eingangspost gelesen? Ich schrieb, dass ich bereits damit begonnen habe und es um die Erstellung von C++-Code erweitern möchte. Und falls es schon etwas ähnliches gibt, könnte ich mir das ja sparen. ;-)
Xin hat geschrieben:Aber wie möchtest Du ein SELECT in XML ausdrücken? Das wäre natürlich möglich, aber das ein anderes XML-Format.
Gar nicht! Ich möchte die Struktur der Datenbank (d.h. der Tabellen und Spalten) mit XML beschreiben und dann "Baukasten-SQL" dazu generieren und mit Objekten ummauern.
Xin hat geschrieben:Wo kommen die XML-Befehle denn her?
Die XML-Datei baue ich von Hand. Ich versteh die Frage nicht O_o

LG Glocke xD

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8485
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Datenbank mit XML beschreiben

Beitrag von Xin » Mo Mai 13, 2013 10:01 am

Glocke hat geschrieben:Gar nicht! Ich möchte die Struktur der Datenbank (d.h. der Tabellen und Spalten) mit XML beschreiben und dann "Baukasten-SQL" dazu generieren und mit Objekten ummauern.
Ich verstehe jetzt "Objekte ummauern" nicht, aber die Struktur der Datenbank hast Du ja bereits in Deinem XML-Format ausgedrückt.

Das kannst Du natürlich einfach konvertieren. Aber....
Glocke hat geschrieben:Die XML-Datei baue ich von Hand.
...warum?

Warum etwas umständlicher in XML beschreiben, um es dann nach SQL zu transformieren?

Ich glaube, es gibt XML-Datenbanken, ob es einen XML-Connector zu MySQL gibt, weiß ich ehrlich gesagt nicht. Für mich stellt sich immer wieder die Frage nach dem warum!?
Und was soll Dein Skript eigentlich in C++ erzeugen?


Ich arbeite halt daran, aus C++-Klassen SQL und XML zu machen - habe aber PHP nicht dazwischen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3081
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Datenbank mit XML beschreiben

Beitrag von cloidnerux » Mo Mai 13, 2013 10:02 am

Hast du mein Eingangspost gelesen? Ich schrieb, dass ich bereits damit begonnen habe und es um die Erstellung von C++-Code erweitern möchte. Und falls es schon etwas ähnliches gibt, könnte ich mir das ja sparen.
Gelesen habe ich ihn zwar, scheine ihn aber falsch verstanden zu haben.
Mit C++ stellt sich mir die Frage, welches Framework du verwenden willst. Aber so wie ich das in Erinnerung habe, werden in den meisten Frameworks die SQL-Befehle als String übergeben.
Ich würde die Implementation so wählen, dass dein Programm eine Klasse generiert, die Festgelegte Methoden hat, die du dann dynamisch mit Inhalt füllst, z.B initDB, initTable, etc.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Datenbank mit XML beschreiben

Beitrag von Glocke » Mo Mai 13, 2013 10:41 am

cloidnerux hat geschrieben:Mit C++ stellt sich mir die Frage, welches Framework du verwenden willst.
MySQL-Connector.
cloidnerux hat geschrieben:Aber so wie ich das in Erinnerung habe, werden in den meisten Frameworks die SQL-Befehle als String übergeben.
Genau das möchte ich mit dem generierten Code kapseln - nur eben auf die Datenbankstruktur zugeschnitten. Daher soll der Code aif Nasis der in XML-beschriebenen Datenbankstruktur erstellt werden.
cloidnerux hat geschrieben:Ich würde die Implementation so wählen, dass dein Programm eine Klasse generiert, die Festgelegte Methoden hat, die du dann dynamisch mit Inhalt füllst, z.B initDB, initTable, etc.
s.u. ;)
Xin hat geschrieben:Ich verstehe jetzt "Objekte ummauern" nicht, aber die Struktur der Datenbank hast Du ja bereits in Deinem XML-Format ausgedrückt.
Und auf diese beschriebene Struktur möchte ich (z.B. in PHP) verwenden, ohne direkt mit SQL zu arbeiten, d.h. ich kapsle die SQL-Befehle in Methoden.

Beispiel: Zur Tabelle User wird eine Klasse User erstellt. Sie beeinhaltet für jede Spalte ein Attribut (public member). Neben dem Konstruktor besitzt sie zusätzlich Methoden add (führt für diese Instanz ein -INSERT durch), store (führt ein UPDATE durch), destroy (führt ein DELETE durch) und mehrere getByXY (führt ein SELECT durch, wobei XY das entsprechende Attribut/die entsprechende Spalte ist, nach der bzgl. eines Wertes gesucht wird).

Effektiv sollen die Datensätze der Tabellen durch Instanzen der Klassen ausgedrückt werden. Ich weiß nicht ob das schon der Definition eines ORM entspricht ..
Xin hat geschrieben:
Glocke hat geschrieben:Die XML-Datei baue ich von Hand.
...warum?
Dann habe ich eine XML-Datei die meine Datenbank beschreibt. Diese zu ändern ist wesentlich kürzer, als die Implementierungen der Klassen anzupassen (das macht dann das Skript für mich). Ich muss dann lediglich die eigentliche Datenbankstruktur anpassen (könnte ich vom Skript auch machen lassen, indem ich ALTER TABLE's erzeuge - aber das ist an der Stelle ja auch erstmal egal).
Xin hat geschrieben:Ich glaube, es gibt XML-Datenbanken, ob es einen XML-Connector zu MySQL gibt, weiß ich ehrlich gesagt nicht. Für mich stellt sich immer wieder die Frage nach dem warum!?
Und was soll Dein Skript eigentlich in C++ erzeugen?
Es soll Klassen erzeugen (s.o.). Btw habe ich dabei die interne Verwendung der MySQL-Connector-Geschichte im Kopf.
Xin hat geschrieben:Ich arbeite halt daran, aus C++-Klassen SQL und XML zu machen - habe aber PHP nicht dazwischen.
Habe ich auch nicht! Ich will die Datenbank beschreiben und dann (unabhängig voneinander) PHP-Code und/oder C++-Code erzeugen - damit ich sowohl aus einer PHP- als auch aus einer C++-Anwendung auf die Datenbank zugreifen kann.

Wie gesagt: die direkte Verwendung von SQL (d.h. die Query-Strings) will ich kapseln. Allein das Vorbereiten des Prepared Statements mit allen Parametern sind schon ein paar Zeilen. Das sollen mir die aus dem XML generierten Klassen abnehmen.

Ich hoffe ich konnte es ausreichend erklären, was ich eigentlich vorhabe - vermutlich gibt es sowas noch nicht :lol:

LG Glocke

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8485
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Datenbank mit XML beschreiben

Beitrag von Xin » Mo Mai 13, 2013 11:13 am

Glocke hat geschrieben:
Xin hat geschrieben:Ich verstehe jetzt "Objekte ummauern" nicht, aber die Struktur der Datenbank hast Du ja bereits in Deinem XML-Format ausgedrückt.
Und auf diese beschriebene Struktur möchte ich (z.B. in PHP) verwenden, ohne direkt mit SQL zu arbeiten, d.h. ich kapsle die SQL-Befehle in Methoden.

Beispiel: Zur Tabelle User wird eine Klasse User erstellt. Sie beeinhaltet für jede Spalte ein Attribut (public member). Neben dem Konstruktor besitzt sie zusätzlich Methoden add (führt für diese Instanz ein -INSERT durch), store (führt ein UPDATE durch), destroy (führt ein DELETE durch) und mehrere getByXY (führt ein SELECT durch, wobei XY das entsprechende Attribut/die entsprechende Spalte ist, nach der bzgl. eines Wertes gesucht wird).
Bei add und store wäre ich vorsichtig.

Das Objekt sollte wissen, ob es bereits persistiert ist (also in der DB liegt). Wenn es das tut => Update, wenn nicht (weil es z.B. durch new angelegt wurde) so muss es eingefügt werden. Diese Entscheidung kannst Du statisch machen (was ein durchaus interessanter Ansatz ist, wenn er über Template-Spezialisierung abgebildet wird) oder Du rufst einfach eine Funktion auf, die das Objekt wegschreibt.
In jedem Fall würde ich dem Entwickler aber die Entscheidungsgewalt per Default entziehen. Wird der Entwickler nicht gefragt, so erhöht sich die Chance, dass er sich richtig entscheidet. ;-)
Glocke hat geschrieben:Effektiv sollen die Datensätze der Tabellen durch Instanzen der Klassen ausgedrückt werden. Ich weiß nicht ob das schon der Definition eines ORM entspricht ..
Erst, wenn Du etwas programmiert hast, was Dein Objekt mappt - das "M" in ORM eben.
Du musst etwas haben, was Dein Objekt auseinander nimmt in die DB bringt und die Daten aus der DB wieder zu einem Objekt umbaut.

Idealerweise nicht von Hand geschrieben.
Glocke hat geschrieben:Dann habe ich eine XML-Datei die meine Datenbank beschreibt. Diese zu ändern ist wesentlich kürzer, als die Implementierungen der Klassen anzupassen (das macht dann das Skript für mich). Ich muss dann lediglich die eigentliche Datenbankstruktur anpassen (könnte ich vom Skript auch machen lassen, indem ich ALTER TABLE's erzeuge - aber das ist an der Stelle ja auch erstmal egal).
Das klingt für mich, als solltest Du über regelmäßige Backups nachdenken :->
Glocke hat geschrieben:Ich hoffe ich konnte es ausreichend erklären, was ich eigentlich vorhabe - vermutlich gibt es sowas noch nicht :lol:
Doch, ich denke, das kommt immer mal wieder. Es gibt verschiedene Ansätze, gefallen hat mir bisher noch keiner.
Ich versuche das in Gsys einzubringen und experimentiere an der C++-Implementation (welche eigentlich läuft, da sie korrektes SQL produziert, aber halt noch nicht an MySQL angebunden ist).

Aber ich sehe noch nicht den Grund, XML hier zur Code-Generierung zu verwenden.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Datenbank mit XML beschreiben

Beitrag von Glocke » Mo Mai 13, 2013 3:09 pm

Xin hat geschrieben:Bei add und store wäre ich vorsichtig.

Das Objekt sollte wissen, ob es bereits persistiert ist (also in der DB liegt). Wenn es das tut => Update, wenn nicht (weil es z.B. durch new angelegt wurde) so muss es eingefügt werden. Diese Entscheidung kannst Du statisch machen (was ein durchaus interessanter Ansatz ist, wenn er über Template-Spezialisierung abgebildet wird) oder Du rufst einfach eine Funktion auf, die das Objekt wegschreibt.
Spätestens wenn ich den Datensatz kopieren will macht ein "add" eines bisher persistenten Objekts Sinn (dabei wird der Primary Key ID vom DBMS vergeben und dem Objekt anschließend zugeordnet).
Xin hat geschrieben:Erst, wenn Du etwas programmiert hast, was Dein Objekt mappt - das "M" in ORM eben.
Du musst etwas haben, was Dein Objekt auseinander nimmt in die DB bringt und die Daten aus der DB wieder zu einem Objekt umbaut.

Idealerweise nicht von Hand geschrieben.
Imho habe ich das: Die Instanz selbst besteht aus einzelnen Attributen, die wiederum durch die intern durchgeführten SQL-Queries auf die einzelnen Attribute des jeweiligen Datensatzes abgebildet werden. Damit wird die Instanz auf den Datensatz abgebildet. Genauso sammelt die Klasse bzw. die Instanz z.B. mittels SELECT alle notwendigen Attribute, so dass mir schließlich eine Instanz der Klasse zum zugehörigen Datensatz der Tabelle bereitgestellt wird.

Nimmt man das obige Beispiel, dann intendiere ich z.B. die folgende "Verwendung"

PHP-Bsp

Code: Alles auswählen

$myUser = User::getByEmail("foobar@lol.com");
$myUser->name = "Mr. Universe";
$myUser->store();

$other = new User("Foo Bar", "foo@bar.lol", "secret123");
$other->add();

$allUsers = User::getAll();
C++-Bsp

Code: Alles auswählen

User* myUser = User::getByEmail("foobar@lol.com");
myUser->name = "Mr. Universe";
myUser->store();

User* other = new User("Foo Bar", "foo@bar.lol", "secret123");
other->add();

std::vector<User*> allUsers = User::getAll();
Oder sollte ich lieber in meiner eigentlichen Anwendung direkt mit mysqli / MySQL-Connector arbeiten?
Xin hat geschrieben:Das klingt für mich, als solltest Du über regelmäßige Backups nachdenken :->
Was hat das damit zu tun? O_o
Xin hat geschrieben:Doch, ich denke, das kommt immer mal wieder. Es gibt verschiedene Ansätze, gefallen hat mir bisher noch keiner.
Welche Ansätze / Frameworks sind dir denn dazu bekannt?
Xin hat geschrieben:Aber ich sehe noch nicht den Grund, XML hier zur Code-Generierung zu verwenden.
Ich sehe keinen Grund es nicht zu nehmen ^^

LG Glocke

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8485
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Datenbank mit XML beschreiben

Beitrag von Xin » Mo Mai 13, 2013 3:32 pm

Glocke hat geschrieben:Spätestens wenn ich den Datensatz kopieren will macht ein "add" eines bisher persistenten Objekts Sinn (dabei wird der Primary Key ID vom DBMS vergeben und dem Objekt anschließend zugeordnet).
Wenn Du "copy" willst, schreib "copy" und nicht "add".
Glocke hat geschrieben:Imho habe ich das: Die Instanz selbst besteht aus einzelnen Attributen, die wiederum durch die intern durchgeführten SQL-Queries auf die einzelnen Attribute des jeweiligen Datensatzes abgebildet werden. Damit wird die Instanz auf den Datensatz abgebildet. Genauso sammelt die Klasse bzw. die Instanz z.B. mittels SELECT alle notwendigen Attribute, so dass mir schließlich eine Instanz der Klasse zum zugehörigen Datensatz der Tabelle bereitgestellt wird.

Nimmt man das obige Beispiel, dann intendiere ich z.B. die folgende "Verwendung"

PHP-Bsp

Code: Alles auswählen

$myUser = User::getByEmail("foobar@lol.com");
$myUser->name = "Mr. Universe";
$myUser->store();

$otherUser = new User("Foo Bar", "foo@bar.lol", "secret123");
$other->add();

$allUsers = User::getAll();
C++-Bsp

Code: Alles auswählen

User* myUser = User::getByEmail("foobar@lol.com");
myUser->name = "Mr. Universe";
myUser->store();

User* otherUser = new User("Foo Bar", "foo@bar.lol", "secret123");
other->add();

std::vector<User*> allUsers = User::getAll();
Oder sollte ich lieber in meiner eigentlichen Anwendung direkt mit mysqli / MySQL-Connector arbeiten?
Nein, aber
a) ist myUser und otherUser vom gleichen Datentyp. Sobald Du das Ding in eine Funktion gibst, weiß die Funktion nicht mehr, ob der User von User::getByEMail oder new User angelegt wurde, entsprechend auch nicht, ob es store() oder add() aufrufen soll.
b) was hat das ganze mit XML zu tun?! ^^
Glocke hat geschrieben:
Xin hat geschrieben:Das klingt für mich, als solltest Du über regelmäßige Backups nachdenken :->
Was hat das damit zu tun? O_o
Ein ALTER TABLE lässt man nicht generiert auf eine Datenbank ohne Backup los, ALTER!
Glocke hat geschrieben:
Xin hat geschrieben:Doch, ich denke, das kommt immer mal wieder. Es gibt verschiedene Ansätze, gefallen hat mir bisher noch keiner.
Welche Ansätze / Frameworks sind dir denn dazu bekannt?
Java hat einige Persistenz-Frameworks, wie Hibernate. Ich habe mal eins für C# geschrieben, dass per Dateien konfiguriert wurde und über Reflection die Daten komplett auseinander pflückte. Das war schon nicht schlecht, hatte aber ein drei Schichten-System (Die Instanz, einen Datenbank-Cache und eben die Datenbank) was an zwei Übergängen zu inkonsistenten Zuständen führen kann, also viele Abfragen nötig machte, um konsistente Daten zu erzeugen. Den Cache hätte ich mir bei einer eigenen Entwicklung gespart. Das führte beispielsweise dazu, dass ein Datensatz in Tabelle B gelöscht werden konnte, aber erst wirklich verschwinden durfte, wenn die letzte Instanz von A so geschrieben wurde, dass sie keine Referenz auf den Datensatz von B mehr hatte.

In C++ baue ich derzeit ein Mapper-System, bei dem ich für eine Klasse die Membervariablen aufzähle und der Mapper damit eine Liste aufbaut, welche Member welchen Datentyp haben und wie man die ausliest oder reinschreibt. Eine Art Reflection also. Mit einem Converter übersetze ich das ganze in ein anderes Format. Ein SQL-Converter bekommt also den Mapper, der die Klasse beschreibt und eine Instanz der Klasse und wirft mir ein SQL-Update Kommando raus, was ich an den DB-Server schicken kann. Oder ein Table-Create-Kommando, was aus der Mapper-Beschreibung eine SQL-Tabelle macht.

Das finde ich bisher die Ideallösung, die ich für Gsys so geplant habe und mich im letzten Monat mit eine C++-Implementation beschäftigt habe.
Glocke hat geschrieben:
Xin hat geschrieben:Aber ich sehe noch nicht den Grund, XML hier zur Code-Generierung zu verwenden.
Ich sehe keinen Grund es nicht zu nehmen ^^
Okay... als Kriterium mir Aufwand zu machen, habe ich ein anderes: Ich brauche mindestens einen Grund dafür... keinen Grund dagegen zu haben, reicht mir nicht. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten