Ankündigung

Einklappen
Keine Ankündigung bisher.

Objekte mit Attributen variabler Anzahl und variablen Typs speichern

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Objekte mit Attributen variabler Anzahl und variablen Typs speichern

    Hallo mal wieder, liebe PHP.de Gemeinde und SQL Gurus. Vielleicht könnt ihr mir weiterhelfen oder zumindest sinnvolle Stichworte liefern, die meine Google-Suche erfolgreicher macht.

    Ich möchte Benutzern einer Seite ermöglichen, eigene Prototypobjekte mit entsprechenden Eingabeformularen zu erzeugen. Dafür können Sie für jedes Formularfeld einen Namen, Datentyp und Validierungsregeln, insbesondere ob benötigt oder nicht, festlegen. Aus den Eingaben dieser Formulare werden Objekte erzeugt, deren Attribute durch die Formularfelder gefüttert werden. Diese Objekte möchte ich in einer Datenbank persistieren.

    Meine Idee wäre, fünf Tabellen zu nehmen:

    1.) "generic_object_definition" (id, name)

    2.) "attribute_definition" (generic_object_definition_id, id, type, name)

    3.) "validation_rule" (attribute_definition_id,id,rule)

    4.) "generic_object" (generic_object_definition_id,id)

    5.) "generic_object_attribute"(generic_object_id,attri bute_definition_id,entry)


    Zum einen müsste vorm einfügen geprüft werden, ob alle validation rules erfüllt werden.

    Zweitens müsste beim Einsetzen von Datenwerten in 5 per Trigger sichergestellt werden, dass attribute_definition_id und generic_object_id an der Selben generic_object_definition_id hängen.

    Pro:
    Nur valide Attributwerte != null werden gespeichert.

    Contra:
    - Integritätsprüfung erzwingt Trigger
    - Alle Attribute müssten mit Datentyp abgelegt werden, der alles schluckt, z.B. String. Automatische Typprüfung entfällt hierdurch.


    Irgendwie sieht dieser Entwurf nicht aus, wie dass, was ich normalerweise für bekannte Objekte mache. Ist mein Gedankengang Blödsinn? Als Alternative fällt mir momentan nur ein, für jedes Objekt ne eigene Tabelle zu erzeugen. Aber ich glaube, niemand will 30.000 Tabellen in seiner Db haben...

    Viele Grüße,

    Bergtroll

  • #2
    Ist es bei solch komplexen Anwendungen nicht einen Gedanken wert, das alles als JSON-Objekt zu hinterlegen? Oder brauchst Du Zugriff auf die einzelnen Bestandteile?
    [COLOR="#F5F5FF"]--[/COLOR]
    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
    [COLOR="#F5F5FF"]
    --[/COLOR]

    Kommentar


    • #3
      Wow, vielen Dank für die fast sofortige Antwort. Und dazu noch ein guter Punkt... die Objekte werden eigentlich nie direkt fürs GUI ausgelesen, sondern wandern als Input in ein Data Warehouse, wobei neuartige generische Objekte solange auf Halde liegen, bis ein entsprechendes ETL Verfahren implementiert wird. Die Ausgabe erfolgt auf den aggregierten Daten des Warehouse.

      JSON Objekte würde ich einfach als String in der DB ablegen?

      Kommentar


      • #4
        Naja ist jetzt nur ne Idee. Aber ja. Ich muss allerdings zugeben, dass ich mir unter Deinem Ausgangspost nur bedingt etwas vorstellen kann
        [COLOR="#F5F5FF"]--[/COLOR]
        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
        [COLOR="#F5F5FF"]
        --[/COLOR]

        Kommentar


        • #5
          Ich denke, ich habe das Stichwort zu meinem Problem gefunden: http://en.wikipedia.org/wiki/Entity-...te-value_model

          Kommentar


          • #6
            Okay... ich stelle fest, dass die Lösung meines Problems doch NICHT so einfach ist. Also, zum Problem:

            Ich möchte es registrierten Autoren über die WebGUI eines Community Portals erlauben, Fragebogendefinitionen zu erzeugen. Eine Fragebogendefinition definiert eine Reihe an Fragen.

            Für die Fragen gilt Folgendes:
            - Unterschiedliche Fragebogendefinitionen sind voneinander gänzlich unabhängig.
            - Jeder Fragebogendefinition definiert eine konstante Anzahl von Fragen. D.h., es existieren keine Fragen, die nur optional eingeblendet werden. Alle Fragebogeninstanzen die zu derselben Definition gehören, haben demnach auch die gleiche Anzahl Fragen.
            - Fragebogendefinitionen können Fragen als benötigt deklarieren, um eine Benutzereingabe zu erzwingen.
            - Der Antworttyp auf eine Frage wird durch diese festgelegt. Beispielsweise Freitext, ein Datum, eine Zahl, etc. Zu jeder Frage ist genau ein Antworttyp definiert.
            - An die Antworten können weitere Bedingungen gestellt werden. Beispielsweise Zahlenbereiche, erlaubte Zeichen, etc.

            Aus den Fragebogendefinitionen möchte ich automatisch entsprechende Formulare erzeugen, die sofort einsetzbar sind. Die erfassten Daten müssen aber irgendwie auch in der Datenbank gespeichert werden. Ich habe allerdings große Probleme, einen entsprechend flexiblen Datenbankentwurf umzusetzen und weiß auch so langsam nicht mehr, wo ich schauen soll. Der EAV Artikel aus der Wiki ist zwar ganz nett, aber mir ist absolut unklar, wie ich die hier genannten Bedingungen sicherstellen soll?!? Außerdem warnt Joe Celko for der Nutzung von EAV, weil es die Sache sehr verkompliziert. Also entweder suche ich nach den falschen Stichworten oder... k.a.... Habt Ihr nen Tipp, wo ich noch schauen könnte?

            Kommentar


            • #7
              Also wie gesagt: Ein pragmatischer Ansatz wäre, ein komplettes Setup als JSON zu speichern. Die Antworten je nach Einsatzzweck dann ebenfalls oder atomar, bspw. indem Du pro Frage im JSON einen Schlüssel angibst, auf den sich die Antwort bezieht.
              [COLOR="#F5F5FF"]--[/COLOR]
              [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
              [COLOR="#F5F5FF"]
              --[/COLOR]

              Kommentar


              • #8
                Danke nochmals , ich denke, dass ich das so versuchen werde, falls mir bis Sonntag Abend nix Besseres einfällt. Was mir daran nämlich bisschen Bauchschmerzen bereitet ist, dass ich so Datenbankseitig keinerlei Integritätsprüfung durchführen kann? Diese muss rein Softwareseitig geschehen, oder verstehe ich deine Idee falsch? Hast du so etwas schonmal mit JSON umgesetzt? Hat es gut geklappt ?

                Kommentar


                • #9
                  Zitat von Bergtroll Beitrag anzeigen
                  Alle Attribute müssten mit Datentyp abgelegt werden, der alles schluckt, z.B. String.
                  Das ist nicht zwingend der Fall, wenn du schlichtweg für jeden Datentyp eine Tabelle anlegst. Beispielsweise arbeite ich bei einem Webshop mit momentan fünf Tabellen (bool, int, decimal, varchar und text). Zwei weitere Tabellen runden das Ganze ab. Eine ordnet den Objekten eine oder mehrere Attributgruppen zu und die andere weist den Attributgruppen die eigentlichen Attribute zu. Damit bist du sehr flexibel, sowohl bei der Gestaltung deiner Objekte als auch beim Auslesen. Einzig fallen dabei eine Menge SQL-Abfragen an.

                  Kommentar


                  • #10
                    Ich hatte mal sowas geplant, aber die Applikation hat nicht so lange überlebt

                    datenbankseitig keinerlei Integritätsprüfung
                    Ich kann mir da nicht wirklich was drunter vorstellen. Wenn es ums inhaltliche geht (also die Umfragekriterien), kann die Datenbank da sowieso nicht viel prüfen oder? Und als Feldprüfung genügt ja, dass das JSON die Längenbegrenzung nicht sprengt.

                    ich denke, dass ich das so versuchen werde, falls mir bis Sonntag Abend nix Besseres einfällt.
                    Vielleicht hat Doc. E. unser Softwaredesign/Architektur-Experte da noch bessere Ideen.
                    [COLOR="#F5F5FF"]--[/COLOR]
                    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                    [COLOR="#F5F5FF"]
                    --[/COLOR]

                    Kommentar

                    Lädt...
                    X