Aiun Geschrieben 30. Oktober 2008 Teilen Geschrieben 30. Oktober 2008 hi, eine kleine Theorie die ich derzeit prüfe, ob und wie würde es funktionieren flexible Objekte in Mysql abzubilden und einzeln abzufragen. d.h. Ich habe eine Datenstruktur die in etwa so aussieht: class defaultnews { var $date; var $anothervar; var $thirdvar; } [/PHP] und will diese so speichern das die anzahl und Art der Attribute nicht fest steht. Ich weis eigentlich ein Tabu-Thema für Datenbanken, aber es hat schon seine Gründe. Die zu speichernden Datenstrukturen bestehen immer aus einem Objekt (den eigentlichen Daten) und einem Objekttyp / Klasse sowie einer Reihe von Attributen. Hat den Hintergrund, das bei Programmierung einer Anwendung nicht klar ist, welche Daten eigentlich gespeichert werden sollen. Es ist nur klar welche Struktur sie haben (objekte mit attributen, Attribut kann sein zahl, string, datum...) also muss eine art generische Ablagemöglichkeit her. Die Grundidee ist 2 tabellen, die 1. vergibt per autoindex den schlüssel des objektes und speichert die Klasse, die 2. Tabelle beinhaltet attributname, attributwert und attributart. Ein Objekt aus zu lesen ist soweit kein Problem, "select * from attributes where ID=2" Was aber wenn ich alle Objekte von Typ X haben will die ein Attribut A mit wert A1 und ein Attribut B mit wert B1 besitzen ? also select objectID from attributes where ... "Record exist type A value A1 and Record exist Type B value B1" ... ??? mir ist da das Content-Repository JSR-283 zu ohren gekommen, aber wie wird ein dynamischer baum als relationales DBMS (mysql) abgebildet, ohne das die Performance "ganz" in die knie geht ? danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 30. Oktober 2008 Teilen Geschrieben 30. Oktober 2008 auf den ersten blick würde sich IMO doch XML und optional dazu ein schema / eine DTD anbieten. abfragen kann man dann mit XPath oder entsprechender logik. s'Amstel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
.vash Geschrieben 30. Oktober 2008 Teilen Geschrieben 30. Oktober 2008 also mal ganz ehrlich: Dieser Satz "Was aber wenn ich alle Objekte von Typ X haben will die ein Attribut A mit wert A1 und ein Attribut B mit wert B1 besitzen " sagt mir dass Du die beiden Tabellen joinen willst ... und dann die Schnittmenge für mehrere Attribute bilden select distinct objekte.id from objekte inner join attribute on attribute.objektid = objekte.id where attribute.typ = a and attribute.wert = a1 intersect select distinct objekte.id from objekte inner join attribute on attribute.objektid = objekte.id where attribute.typ = b and attribute.wert = b1 oder ich hab nicht kapiert was du willst ^^ wird natürlich bei vielen Attributen etwas unpraktisch ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Aiun Geschrieben 31. Oktober 2008 Autor Teilen Geschrieben 31. Oktober 2008 noch ist das ganze in der Konzeptionsphase *g* Wenn ich dein beispiel richtig verstehe vash, bin ich dann allerdings nur auf der Objekt-ID und muss noch einmal alle Attribute dieses Objekts abfragen. "geht das noch performanter" ?? ^^ Amstelchen, auf die Idee bin ich auch schon gekommen, wobei ich versuche zwischen Performance und Flexiblität den richtigen Punkt zu treffen, XML scheint mir da nicht die richtige Lösung. Beispiel wie das ganze arbeiten würde: Anwendung X schreibt Adressdaten (name, straße etz) in ein 'Datenbanksystem', respektive eine Datenbank-Abstraktionsschicht in der Anwendung. Plugin P für Anwendung X arbeitet auch gerne mit Adressdaten, benötigt für seine Arbeit jedoch 3 bestimmte Felder, sagen wir Hobbies, Geburtstag und Alter Das Problem: Plugin P weis nicht ob die Adresspflege in der Anwendung verfügbar ist. Anderes Beispiel wäre, wenn der Nutzer/Admin nun 'andere' Daten pflegen möchte, News, RSS-Feeds, Kommentare, Termine... Die Suchmaschine meiner Wahl führte mich jetzt einmal auf eine Seite die sich mit einem ähnlichen Problem beschäftigt hat, auf der der Autor beschrieb dann doch lieber "normale" Tabellen mit duzenden von Spalten an zu legen. Das würde jedoch dazu führen das irgendwann niemand so genau weis wofür nun welche Spalte ist, im zweifelsfall die Struktur so weit verändert (Spalte löschen) das die anwendung nicht mehr funktioniert. Es kann auch gut sein das in der Anwendung plötzlich 4x Adressdaten geflegt werden, nur jeweils für unterschiedliche Zwecke, in unterschiedlichen Objektarten. Trotzdem wäre eine Funktion "finde alle objekte die Attribut 'Ort' haben' recht nett. Die Frage ist die Performance , an sich könnte ich natürlich auch Objekte einfach als Datei ablegen und durchsuchen, aber mal davon ausgehend das es hunderte von Objekten werden nicht sinnvoll. Ich bin jetzt auf "Alfresko" gestoßen, für das es wohl APIs für verschiedene Sprachen gibt, werde mir das evtl. mal ansehen, aber an sich ist meine Suche eher auf Mysql gerichtet...aber das "wie" ist ein Problem. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
U-- °LoneWolf° Geschrieben 31. Oktober 2008 Teilen Geschrieben 31. Oktober 2008 um welche programmiersprache gehts den? Ok du willst die daten in ne MySQL Datenbank schreiben soweit klar ... falls es .Net ist, ist es das einfachste wenn du deine Klassen serialisirbar machst und das XML der Objekte in die db schreibst. Funktioniert eiegentlich ganz einfach Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Aiun Geschrieben 31. Oktober 2008 Autor Teilen Geschrieben 31. Oktober 2008 (bearbeitet) php(5) wobei ich das Prinzip allgemein betrachte, welche möglichkeiten es gibt. Allerdings bringst du mich da auf eine Idee. Ein einzelnes Objekt-XML in der Datenbank, sorgt für einen Datensatz je Objekt ohne festlegung der Objekte und ich kann die attribute durchsuchen select * from objects where attributes like '%<myattr>abc</myattr>%' .... was vielleicht etwas kompliziert wird, wenn ich teile eines attributes suche select * from objects where attributes like '%<myattr>startofattr%</myattr>%' das 2. % würde ja den rest des Feldes mit einbeziehen. Ich werde mich noch mal in mysql-Selektoren einlesen, vielleicht gibt es ja da noch etwas. Edit: es sieht so aus als das Mysql auch Reguläre ausdrücke in Selects kann, das würde das Problem vermutlich lösen. hat jemand einen Kommentar zu der Performance einer solchen Lösung ? Bearbeitet 31. Oktober 2008 von Aiun Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
U-- °LoneWolf° Geschrieben 31. Oktober 2008 Teilen Geschrieben 31. Oktober 2008 Was die Perf. angeht sind text suchen immer ganz shclecht .... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Aiun Geschrieben 31. Oktober 2008 Autor Teilen Geschrieben 31. Oktober 2008 Ich habe das Konzept mal weiter gesponnen, von PHP/Logikseite aus ist es klar, nur bei der Datenbank ist es etwas wacklig. das Content-Repository (um dem Kind mal einen Namen zu geben) wird von einem Administrator konfiguriert, dazu gibt es Namensräume in denen die Objekte gespeichert werden. Namensräume dienen später dazu, thematische Teilmengen aus zu lesen. Der Administrator definiert Objektstrukturen, Klasse A hat Attribute B, C, und D, entsprechende Datentypen, mit welchem Titel die Felder in einer grafischen oberfläche benannt werden sollten etz. also "Name" ist ein String, wird angezeigt als "Name" (hier greift noch eine Mehrsprachigkeit der PHP-Logik) Diese Objektstruktur kann später verändert werden und wird dann mit eigenen Versionsnummern/Versionsdatum in der Datenbank gespeichert. Die PHP-Logik verwendet diese Struktur um Formulare und Übersichten dar zu stellen. Redakteure / User können nun in Namensräumen Objekte anlegen oder verändern, entsprechend der hinterlegten Objektstruktur. Das CR speichert zu jedem Objekt die Version der Struktur, somit kann ein Datensatz vom Typ "adresse" verschiedene Felder haben, abhängig davon ob der Admin den Typ geändert hat. Ein User kann dieses Objekt dann ändern, in eine neue Strukturversion übernehmen oder schlicht bearbeiten. Ich vermute das hier auch eine Versionsnummer der Objekte greifen wird...aber mal sehen welche Erkenntnisse ich aus der Testimplementierung gewinnen kann. Das ist natürlich nicht für gigantische Performance und Millionen von Datensätzen ausgelegt, aber für das eine oder andere Tausend 'soll' es schon geeignet sein. Wenn jemand sich später entscheidet die Struktur nicht mehr zu verändern und es mehr Performance benötigt, können die Daten ja in "statische" Tabellen übernommen werden. Normale Mysql-Tabellen würden hier, schon wegen den verschiedenen Versionen nicht funktionieren. Also verfolge ich erst einmal die Idee mit dem XML weiter. (oder hat noch jemand Anregungen für mich ?) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
U-- °LoneWolf° Geschrieben 31. Oktober 2008 Teilen Geschrieben 31. Oktober 2008 naja es gäbe auch die möglichkeit die systemtabellen von mysql nachzubilden so könntest du dir zu jederzeit durch ein insert statement eine neue klasse mit den entsprechenden objeten erzeugen hab sowas mal in einem kleienn projekt gesehen war sehr genial aber durchsteigen war da unmöglich Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 31. Oktober 2008 Teilen Geschrieben 31. Oktober 2008 Wenn es wirklich erstmal um die Theorie geht, und du jetzt nicht 100%ig MySQL einsetzen musst, kannst du ja auch mal einen kleinen Blick auf OODBs (Object Oriented Database) werfen. Diese Art der Datenbanken machen nämlich genau das, was du möchtest, sie speichern die Objekte direkt in der DB, sodass zwischen OOP-Sprachen und der Datenbank kein Mapping mehr vorgenommen werden muss. Vll findest du dort ja auch interessante Ansätze für deine Theorie. Leider habe ich jetzt auf die schnelle nur OODBs gefunden die sich auf Java oder C# spezialisiert haben. Explizit eine auf die man mit PHP zugreifen kann, habe ich leider nicht gefunden. Ich weiß, es ist jetzt nicht vollkommen dass, was du wolltest, aber vll findest du darin noch nen Ansatz für deine Lösung. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Aiun Geschrieben 31. Oktober 2008 Autor Teilen Geschrieben 31. Oktober 2008 wenn ich eine perfekte lösung erwarten würde, müsste ich wohl nicht mehr selbst dran arbeiten danke, werde ich mir auch mal ansehen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
.vash Geschrieben 31. Oktober 2008 Teilen Geschrieben 31. Oktober 2008 Wenn ich dein beispiel richtig verstehe vash, bin ich dann allerdings nur auf der Objekt-ID und muss noch einmal alle Attribute dieses Objekts abfragen. ich weiß ja nicht wie komplex Deine Abfragen werden sollen. Wenn Du Dich scheust ein monströses SQL Query zu bauen, dann kannst Du dir ja auch mehrere in Frage kommenden Objekte zusammensuchen und diese dann per Code filtern. Wenn Performance das Nr. 1 Kriterium ist wirst Du aber evtl. mit einer standard SQL DB nicht weit kommen. Bei unserer Firma arbeitet auch ein Team an einer Speziallösung die gewisse Teile einer MSSQL DB ersetzen soll - weil letztere einfach nicht performant genug ist, oder besser gesagt: Es geht einfach "noch" schneller. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Aiun Geschrieben 2. November 2008 Autor Teilen Geschrieben 2. November 2008 danke soweit konzentriere mich jetzt auf eine Test-Implementierung mit Oberfläche. Da die CR-Funktionen gekapselt werden kann ich das ganze später noch austauschen, die das UI hilft, die Anforderungen zu erfassen. Dann weiter sehen. erster anwendungszweck ist die unterstützung eines Content-Management System. News, Kontakte, Downloads unsw. die ich derzeit über den Content-Editor einpflegen muss, wird dann über das CR verwaltet und per Plugin im CMS ausgegeben. Ergo: CR-Objekte werden zu news-listen, RSS, Download-Listen. In diesem Anwendungsgebiet vermute ich noch keine gleichzeitige verarbeitung/liste von mehr als 200 Objekten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Aiun Geschrieben 7. November 2008 Autor Teilen Geschrieben 7. November 2008 Problem: Sortieren einer MYSQL-Abfrage nach einem "teil" eines Inhalts. ich habe derzeit Objekte in XML form in einer Mysql-Spalte <myobj> <mytitle>ABC</mytitle> <mydate>2008-11-07</mydate> </myobj> (1 Objekt je Datensatz) und jetzt sollen die Objekte nach Datum sortiert werden. Ich hatte auf Regexp gehofft, aber das scheint 'so' nicht zu funktionieren. (XML ist keine Vorgabe, nur der aktuelle ansatz) hat jemand eine Idee ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.