Zum Inhalt springen

Objekte in Mysql abbilden, Abfrage ?


Aiun

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Aiun
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ?)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...