Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Was ist schneller Script oder Datenbankabfrage?

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Was ist schneller Script oder Datenbankabfrage?

    Hallo zusammen,

    ich habe designtechnisch ein Problem und würde gerne von euch Wissen was mehr Sinn macht.
    Es gibt zwei Systeme, welche über SOAP verbunden sind. Auf dem Server liegt eine Datenbank, dort habe ich jetzt Testweise eine Tabelle angelegt mit drei Spalten. ID; GERMAN; ENGLISCH. Per Manuellen Tastendruck wird ein Script ausgeführt, welches aus dieser Tabelle ein Script baut. Nämlich dieses:
    PHP-Code:
    <?php

    /*###################################################################################*
    */

    function babelit($language$key_word)
    {
    $language strtoupper($language);
        switch (
    $language)
        {
            case 
    'GERMAN':
            return 
    GERMAN($key_word);
            break;
            case 
    'ENGLISH':
            return 
    ENGLISH($key_word);
            break;
            default:
            return 
    GERMAN($key_word);
            break;
        }
    }
    /*###################################################################################*
    * @function GERMAN($key_word)                                                        *
    *                                                                                    *
    * @brief language = GERMAN                                                           *
    *                                                                                    *
    *####################################################################################*/
    function GERMAN($key_word)
    {
        switch (
    $key_word)
        {
            case 
    'ID2_INPUTFIELD_DISCRIPTION_USERNAME':
            return 
    "Benutzername";
            break;

            case 
    'ID2_INPUTFIELD_DISCRIPTION_PASSWORD':
            return 
    "Passwort";
            break;

            case 
    'ID1_BUTTON_COMMAND_LOGIN':
            return 
    "Anmelden";
            break;

        }
    }

    /*###################################################################################*
    * @function ENGLISH($key_word)                                                         *
    *                                                                                    *
    * @brief language = ENGLISH                                                             *
    *                                                                                    *
    *####################################################################################*/
    function ENGLISH($key_word)
    {
        switch (
    $key_word)
        {
            case 
    'ID2_INPUTFIELD_DISCRIPTION_USERNAME':
            return 
    "Username";
            break;

            case 
    'ID2_INPUTFIELD_DISCRIPTION_PASSWORD':
            return 
    "Password";
            break;

            case 
    'ID1_BUTTON_COMMAND_LOGIN':
            return 
    "login";
            break;

        }
    }
    ?>
    Nun kann ich auf der Client Seite Header-Dateien definieren, welche so aussehen könnten:
    PHP-Code:
       $_SESSION['language'] = $_GET['SPRACHE'];
       include 
    "sprachen.def";
       
    define(USERNAMEbabelit($_SESSION['language'], "ID2_INPUTFIELD_DISCRIPTION_USERNAME"));
       
    define(PASSWORDbabelit($_SESSION['language'], "ID2_INPUTFIELD_DISCRIPTION_PASSWORD"));
       
    define(LOGINbabelit($_SESSION['language'], "ID1_BUTTON_COMMAND_LOGIN"));
       
    define(SPRACHENsprachen_tool_bar()); 
    Diese Scripte liegt natürlich auf der Clientseite.
    Somit spar ich mir die Datenbankaufrufe über SOAP für eine Sprachumstellung.

    Die Frage, welche sich mir nun stellt, wie Sinnvoll bzw frei ist dieses vorgehen?
    Klar ist, dass diese Datei irgendwann sehr sehr groß wird. Da es natürlich nicht bei 10 IDs pro Sprache bleibt.
    Es gibt bestimmt einfache Tools die eine Mehrsprachigkeit ermöglichen, allerdings würde ich schon gerne wissen, wie meine Lösung letztlich professionellen Anforderungen stand hält und da seid ihr nun gefragt.
    Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

  • #2
    ich persönlich finde es schrecklich in den views irgendwelche ids und platzhalter zu haben, man muss dann ständig nachsehen was der eigentliche text dazu ist.

    ich habe einfach eine sprachdatei mit einem array der etwa so aussieht

    PHP-Code:
    i18n/de.php
    return array(
    'Username'=>'Benutzername',
    'Password'=>'Password'

    in meinen views sieht man dann ledeglich folgendes
    PHP-Code:
    <?= __('Username')?><br/>
    <?= __('Password')?>
    bei weiteren sprachen, wird eine neue Datei angelegt.

    Nachteil ist, dass wenn man jetzt sagen wir 5 sprachdateien hat, und mal eine erweiterung geschrieben hat, mit weiteren wörtern. dann muss man es auch bei anderen dateien anpassen

    alternativ bietet dir auch gettext eine möglichkeit an. mit poedit werden deine php dateien nach _('text') durchsuch und es werden platzhalter definiert, diese muss du dann in belibige sprache übersetzen. dafür müssen aber auf dem server bestimmte locales installiert sein mit entsprechneden charsets.

    aber dein aktuellen switch case konstrukt oder die datenbank würde ich gleich weglassen
    apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

    Kommentar


    • #3
      Zitat von BlackScorp Beitrag anzeigen
      ich persönlich finde es schrecklich in den views irgendwelche ids und platzhalter zu haben, man muss dann ständig nachsehen was der eigentliche text dazu ist.

      ich habe einfach eine sprachdatei mit einem array der etwa so aussieht

      PHP-Code:
      i18n/de.php
      return array(
      'Username'=>'Benutzername',
      'Password'=>'Password'

      in meinen views sieht man dann ledeglich folgendes
      PHP-Code:
      <?= __('Username')?><br/>
      <?= __('Password')?>
      bei weiteren sprachen, wird eine neue Datei angelegt.

      Nachteil ist, dass wenn man jetzt sagen wir 5 sprachdateien hat, und mal eine erweiterung geschrieben hat, mit weiteren wörtern. dann muss man es auch bei anderen dateien anpassen

      alternativ bietet dir auch gettext eine möglichkeit an. mit poedit werden deine php dateien nach _('text') durchsuch und es werden platzhalter definiert, diese muss du dann in belibige sprache übersetzen. dafür müssen aber auf dem server bestimmte locales installiert sein mit entsprechneden charsets.

      aber dein aktuellen switch case konstrukt oder die datenbank würde ich gleich weglassen
      Erstmal danke für das harte aber ehrliche Urteil
      Bei dem Array hab ich so meine Probleme, da ich ganze Texte in verschiedene Sprachen ausgeben möchte und ich mir gedacht habe, das so ein Array, dann doch recht groß wird. Aber gut, man muss ja das Rad nicht unbedingt neu erfinden.
      Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

      Kommentar


      • #4
        ja dann wird halt das array groß, du könntest ja dort caching methoden einbauen die das array im APC cache oder so speichern und außerdem musst du ja nicht jedes key auslesen, das was bereits angezeigt wurde, kannst du wieder in ein seperaten array abspeichern. vor dem anzeigen, prüfst du zusätzlich ob das wort bereits mal geladen wurde, wenn ja, zeig es direkt an, wenn nein, lade sprach datei und hole mir das wort.
        apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

        Kommentar


        • #5
          Zitat von BlackScorp Beitrag anzeigen
          ja dann wird halt das array groß, du könntest ja dort caching methoden einbauen die das array im APC cache oder so speichern und außerdem musst du ja nicht jedes key auslesen, das was bereits angezeigt wurde, kannst du wieder in ein seperaten array abspeichern. vor dem anzeigen, prüfst du zusätzlich ob das wort bereits mal geladen wurde, wenn ja, zeig es direkt an, wenn nein, lade sprach datei und hole mir das wort.
          Stimmt wohl. Najut, schade eigentlich.^^
          Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

          Kommentar


          • #6
            Eine Tabelle mit den Spalten German und Englisch. Viel Spass beim Erstellen von 80 weiteren Sprachen.

            Stichwort: Normalisierung!

            Tabelle language
            - lang#
            - lang-name
            Tabelle phrases
            - phrase#
            - lang#
            - phrase-value

            O.ä.
            [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


            • #7
              Zitat von ChristianK Beitrag anzeigen
              Eine Tabelle mit den Spalten German und Englisch. Viel Spass beim Erstellen von 80 weiteren Sprachen.

              Stichwort: Normalisierung!

              Tabelle language
              - lang#
              - lang-name
              Tabelle phrases
              - phrase#
              - lang#
              - phrase-value

              O.ä.
              Ehm, Ob ich jetzt 80 spalten hinzufüge und dann für jeden Button, Text, Satz etc. die Datensätze anpasse, oder 80 Zeilen in der einen Tabelle hinzufüge und dort jeder satz, bzw. jede satz id 80 mal auftaucht ist auch nicht normalisiert.
              Oder ich verstehe hier etwas nicht. Aber diese Tabelle ist normalisiert:

              PHP-Code:
              /*
              Tabelle:
              ID             Deutsch              Englisch             Französisch
              01             Hallo                Hello                Salut
              02             Bestätigen           Confirm              Tralala
              03             Willkommen           Welcome              Bien veniu (oder so ähnlich)
              */

              $daten mysql_fetch_assoc(mysql_query("SELECT Deutsch FROM Tabelle WHERE ID = '01'"));
              (
              $daten['Deutsch'] == "Hallo"); 
              Oder warum sollte man so eine Tabelle für das entsprechende Vorhaben anders erstellen
              Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

              Kommentar


              • #8
                sobald du eine weitere spalten für eine neue sprache erstellen musst, ist es nicht mehr normalisiert.. zur normalisierung braucht man mehr als nur eine ID aber nicht vergessen dass die datenbank das Flaschenhals einer PHP Anwendung ist
                apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                Kommentar


                • #9
                  Zitat von BlackScorp Beitrag anzeigen
                  sobald du eine weitere spalten für eine neue sprache erstellen musst, ist es nicht mehr normalisiert.. zur normalisierung braucht man mehr als nur eine ID aber nicht vergessen dass die datenbank das Flaschenhals einer PHP Anwendung ist
                  Japp, das mit den Flaschenhals hab ich mir schon gedacht, daher der generierte Code aus der Datenbank. Somit ist zur Laufzeit ein Zugriff auf die Datenbank für die Sprachen nicht mehr nötig.
                  Normalisiert wäre in dem Fall die andere Datenbank aber auch nicht. Da ich die ID Hallo beispielsweise mehrfach bräuchte, oder ich müsste für jede Sprache eine Tabelle anlegen, wo ich dann ID Hallo referenziere. Was ich aber für ungüstig halte. Ich fände es so schon besser.
                  Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

                  Kommentar


                  • #10
                    Sobald du dynamische Tabellenanzahlen brauchst oder dynamische Spalten dann ist etwas falsch.

                    So wie ich es handhabe habe ich etwas unterschlagen. Ich müsste in der Tabelle phrases noch eine Spalte parent# machen, die auf die Tabelle phrase_items referenziert. Dort hast du zwei Spalten phrase_items# und phrase_item-name. Im Template verwendest du nur das phrase_item-name, kannst damit dann zu jeder Sprache den zugehörigen Text holen.

                    Btw: Eine Datenbank kann mit 80 Spalten weitaus weniger gut umgehen als mit 80*250*x Einträgen in einer Tabelle
                    [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


                    • #11
                      Glieder deine Übersetzungen doch in mehrere Arrays auf und nutze einen Container der die Zugriffe auf die Dateien regelt. So kannst du zumindest unterbinden das immer alle Sprachen und alle Komponenten der Übersetzungen zur gleichen Zeit includiert werden..

                      PHP-Code:
                      $translates = new Pimple;

                      $translate['de'] = $translate->share(function() {
                         
                      $o = new Pimple;
                         foreach ( new 
                      DirectoryIterator(__DIR__.'/locales/de/') as $current ) {
                            if ( 
                      $current->isDot() || $current->isDir() ) {
                               continue;
                            }

                            
                      $basename $current->getBasename('.php');
                            
                      $file $current->getPathname()
                            
                      $o[$basename] = $o->share(function() use ($file) {
                               return include 
                      $file;
                            };
                         }

                         return 
                      $o;
                      }); 
                      Pimple gibt es via Composer:
                      Code:
                      {
                         "require": {
                            "pimple/pimple": "1.0.*@dev"
                         }
                      }
                      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                      Kommentar


                      • #12
                        Danke für die vielen Antworten.
                        Ich werd glaub ich eine kombiniete Lösung nehmen. Das mit dem Array, fand ich Anfangs selber ganz toll.
                        Allerdings sind die Anforderungen ehr:
                        - max. 6-8 Sprachen
                        - Pflege der Daten, darf keine programmier Kenntnisse voraussetzen
                        - Zur Laufzeit sollte man ohne Datenbank aufruf auskommen

                        Aber durch die vielen Vorschläge lässt sich bestimmt richtig gut was basteln.

                        DANKE
                        Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

                        Kommentar


                        • #13
                          du kannst doch ein editor programmieren, der dann am ende so ein sprachen array generiert, und eventuell nicht gefundene übersetzungen hervorhebt etc..
                          apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                          Kommentar


                          • #14
                            Bei einer DB kannst praktischerweise ein Fallback-Lösung anbieten,
                            so daß immer der Text der Default-Sprache angezeigt wird,
                            falls ein Text noxh nicht übersetzt ist.

                            mit GROUP BY und ORDER BY in einer Abfrage.
                            Eine if-else-Abfrage nimmt, ordentlich geschrieben eine Menge Platz weg. Platzsparend geht es mit einem ternären Operator.

                            Kommentar


                            • #15
                              Ich würde auf jeden Fall zu Gettext raten, es ist ziemlich leicht zu handhaben und man braucht sich keine Gedanken zum caching oder generieren von Arrays zu machen, außerdem spart man sich eine Menge Aufwand.

                              Es gibt bestimmt einfache Tools die eine Mehrsprachigkeit ermöglichen, allerdings würde ich schon gerne wissen, wie meine Lösung letztlich professionellen Anforderungen stand hält und da seid ihr nun gefragt.
                              Mit ein wenig herumbasteln durchaus denkbar, zumindest von der Performance her.

                              Aber die Handhabung stelle ich mir schrecklich vor, was wäre z.B. wenn du Plural / Singular Formen brauchst und dann vielleicht auch noch in eine Sprache übersetzt die mehr als zwei Formen kennt... oder du von einem adjektiv jeweils das feminine, maskuline, sachliche, dativ, genitiv.... übersetzt haben möchtest?

                              Dazu bietet POedit die Möglichkeit deine PHP Dateien zu parsen und selbst die Keywords herauszusuchen (sehr praktisch) und erlaubt es Kommentare zu erstellen, das wäre z.B. wichtig bei Wörtern die mehrere Bedeutungen haben können, je nach Kontext.

                              Einfaches Beispiel: Geist.

                              Das kann der Verstand sein (mind)
                              Oder ein Gespenst (Ghost)

                              Schloss: Festung oder Türschloss?

                              Und wenn du absrakte Keywords hast wie ("LANDINGPAGE greeting %user%") dann möchtest du dass vielleicht auch kommentieren. (weil du mit Sicherheit nicht den gesamten Wortlaut als Schlüsselwort verwenden möchtest, alleine deshalb weil ein einziger Rechtschreibfehler einen erheblichen Aufwand bedeuten könnte).

                              Wenn du deine Seite von Jemand drittem übersetzen lassen möchtest musst du sowas klar machen.

                              Außerdem hat Gettext ein nettes Interface für die Übersetzer, so etwas müsstest andernfalls auch noch programmieren...

                              Kommentar

                              Lädt...
                              X