Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Speichern von variablen Datentypen in MySQL Tabelle

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Speichern von variablen Datentypen in MySQL Tabelle

    Hallo,

    ich würde gerne wissen, wie man am Besten variable Datentypen (int/double/char) in ein und der selben Tabelle speichert. Ich dachte jetzt einmal daran die Daten in einem json Array anzulegen und dann als TEXT in der Tabelle zu speichern.
    Die Struktur wäre also:

    PHP-Code:
    $data = array ( "dataType"value );
    $json json_encode($data);

    // DB upload 
    Die Datenbank ist ziemlich groß und ich habe Bedenken wegen dem Speicherplatz!? Wie würde man das am Besten umsetzen?

    Danke!

  • #2
    Zitat von Poolshark Beitrag anzeigen
    Hallo,

    ich würde gerne wissen, wie man am Besten variable Datentypen (int/double/char) in ein und der selben Tabelle speichert.
    In separaten Spalten. Kann sogar MySQL.

    Ich dachte jetzt einmal daran die Daten in einem json Array anzulegen und dann als TEXT in der Tabelle zu speichern.
    geht auch. Andere datenbanken haben JSON bzw. JSONB als Datentyp, da kannst dann z.B. auch direkt drin abfragen, indexbasiert und so. Hat aber MySQL nicht. pech für Dich.

    Die Datenbank ist ziemlich groß und ich habe Bedenken wegen dem Speicherplatz!? Wie würde man das am Besten umsetzen?

    Danke!
    PostgreSQL 9.4 nehmen, mit JSONB als Datentyp. Ja, derzeit noch Beta, aber nicht mehr lange, dann gibt es die auch richtig.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Wow, danke für die schnelle Antwort!

      In separaten Spalten. Kann sogar MySQL.
      Daran habe ich auch schon gedacht, allerdings gefällt mir daran nicht, dass ich dann pro Zeile jeweils 2 empty fields habe...

      PostgreSQL 9.4 nehmen, mit JSONB als Datentyp. Ja, derzeit noch Beta, aber nicht mehr lange, dann gibt es die auch richtig.
      Leider keine Option, da nur MySQL vorhanden... Kann nun der Speicherbedarf bei der Wahl von TINYTEXT sozusagen für alle Datentypen (int/double/char) bei großen DBs zum Problem werden? Wird bei TEXT immer der maximale Bedarf reserviert, oder richtet sich das nach der Anzahl der Zeichen?

      Sorry für die dumme Frage...

      Kommentar


      • #4
        Zitat von Poolshark Beitrag anzeigen
        Leider keine Option, da nur MySQL vorhanden...
        Dein Problem. mein Mitleid hält sich in Grenzen.

        Kann nun der Speicherbedarf bei der Wahl von TINYTEXT sozusagen für alle Datentypen (int/double/char) bei großen DBs zum Problem werden? Wird bei TEXT immer der maximale Bedarf reserviert, oder richtet sich das nach der Anzahl der Zeichen?

        Sorry für die dumme Frage...
        Das Problem ist eher nicht der Platz, sondern der Umgang mit den Daten dann.
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Wieviel Speicherplatz du brauchst kannst du hier nachlesen: http://dev.mysql.com/doc/refman/5.1/...uirements.html
          => das wird also kein Problem sein. Wie schon angemerkt könnte der Umgang damit ein Problem werden, wobei ich nicht ganz verstanden habe was du jetzt speichern willst JSON-Strings oder int/double/char?

          Kommentar


          • #6
            Ich denke der Umgang mit den Daten ist kein Problem. Ich würde folgendes machen:

            PHP-Code:
            $dataOrg = array ( 'int'); 
            $json json_encode($data); 

            // DB upload
            $conid = new mysqli'host''user''pass''name' ); // Validierung, blabla ...

            $sql "INSERT INTO `data` (`jsonData`) VALUES ('".$json."')";
            $conid query($sql);

            // Auslesen aus DB (wenn schon mehrere Einträge vorhanden)
            $sql "SELECT `jsonData` FROM `data";
            $result $conid->query($sql);

            while ( 
            $row $result->fetch_object() ) {
              
            $datArray[] = json_decode($row->jsonData); 
            }

            $result->close();
            $conid->close();

            // Auslesen der Daten plus Typ
            foreach ( $datArray as $v1 ) {
              
            $dataDB $v1;
              
            var_dump($dataDB);
              echo 
            '<br />';

            Ausgabe:
            Code:
            array(2) { [0]=> string(10) "int" [1]=> int(2) }
            Glaube ich zumindest...

            Kommentar


            • #7
              Wenn du jetzt die Summe von allen Integer-Werten bilden willst, musst du folgenden Weg gehen

              1. Select über alle
              2. Auswerten welchen Typ
              2.1 Summieren

              Ohne den genauen Weg in PG zu kennen behaupte ich, dass das dort in einem Query möglich ist.
              [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

              Kommentar


              • #8
                Das ist in diesem Fall egal da ich über eine andere Tabelle einen FK bekomme und so schon den Datentyp vorselektiere.

                tbl_datType: id -> PK, type, dataType
                tbl_value: id -> PK, datTypeId -> FK, value

                Damit lese ich auch nur diejenigen Arrays aus die ich auch wirklich brauche und ich könnte auch über alle Integer Werte summieren.

                Kommentar


                • #9
                  Zitat von ChristianK Beitrag anzeigen

                  Ohne den genauen Weg in PG zu kennen behaupte ich, dass das dort in einem Query möglich ist.
                  Das, was PG da kann, ist bei Abfragen auf solche Datenfelder Indexe zu nutzen. Das erspart teure Full-Table-Scans. Mehr dazu in der Doku: http://www.postgresql.org/docs/9.4/s...type-json.html
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar

                  Lädt...
                  X