Ankündigung

Einklappen
Keine Ankündigung bisher.

Design einer DB für mehrsprachigkeit

Einklappen

Neue Werbung 2019

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

  • #31
    Ok, hier mal ein Beispiel einer möglichen Struktur.

    Diese Tabelle soll, den Namen eines Landes (in beliebig vielen Sprachen) und dessen gesamtfläche speichern.
    Code:
    laender
    +------+---------+
    | trid | flaeche |
    +------+---------+
    | 1    | 400qm   |
    +------+---------+
    | 2    | 200qm   |
    +------+---------+
    Diese Tabelle soll, den Namen einer Stadt (in beliebig vielen Sprachen) und dessen Einwohnerzahl speichern.
    Code:
    staedte
    +------+-----------+
    | trid | einwohner |
    +------+-----------+
    | 1    | 1000      |
    +------+-----------+
    | 2    | 4000      |
    +------+-----------+
    In dieser Tabelle stehen alle namen der DB-Tabellen in dennen sprachvariablen vorkommen können.
    Code:
    tables
    +-----+---------+
    | tid | name    |
    +-----+---------+
    | 1   | laender |
    +-----+---------+
    | 2   | staedte |
    +-----+---------+
    In dieser Tabelle stehen die Namen der DB-Felder die normalerweise in den Tabellen Laender bzw. staedte stehen würden
    Code:
    fields
    +-----+------+
    | fid | name |
    +-----+------+
    | 1   | name |
    +-----+------+
    In dieser Tabelle stehen die sprachen die zur verfügung stehen sollen.
    Code:
    langs
    +-----+------+
    | lid | name |
    +-----+------+
    | 1   | de   |
    +-----+------+
    | 2   | en   |
    +-----+------+
    Diese Tabelle verbindet dann alles miteinander und kann auch anhand der gespeicherten daten, den eintrag in dem die übersetzung verwendet werden soll zurückverfolgen.
    Code:
    tables_fields_langs_texts
    +-----+-----+-----+-----+------+-------------+
    | id  | tid | fid | lid | trid | txt         |
    +-----+-----+-----+-----+------+-------------+
    | 1   | 1   | 1   | 1   | 1    | Deutschland | # Tabelle "laender" feld "name" sprache "de" id "1"
    +-----+-----+-----+-----+------+-------------+
    | 2   | 1   | 1   | 2   | 1    | Germany     | # Tabelle "laender" feld "name" sprache "en" id "1"
    +-----+-----+-----+-----+------+-------------+
    | 1   | 1   | 1   | 1   | 2    | Frankreich  | # Tabelle "laender" feld "name" sprache "de" id "2"
    +-----+-----+-----+-----+------+-------------+
    | 2   | 1   | 1   | 2   | 2    | France      | # Tabelle "laender" feld "name" sprache "en" id "2"
    +-----+-----+-----+-----+------+-------------+
    | 5   | 2   | 1   | 1   | 1    | München     | # Tabelle "staedte" feld "name" sprache "de" id "1"
    +-----+-----+-----+-----+------+-------------+
    | 6   | 2   | 1   | 2   | 1    | Munich      | # Tabelle "staedte" feld "name" sprache "en" id "1"
    +-----+-----+-----+-----+------+-------------+
    | 7   | 2   | 1   | 1   | 1    | Rom         | # Tabelle "staedte" feld "name" sprache "de" id "2"
    +-----+-----+-----+-----+------+-------------+
    | 8   | 2   | 1   | 2   | 1    | Rome        | # Tabelle "staedte" feld "name" sprache "en" id "2"
    +-----+-----+-----+-----+------+-------------+
    Mit beliebig erweiterbar meine ich dass im nachhinein z.b. noch die Tabelle sehenswürdigkeiten dazu kommen kann.
    Code:
    sehenswuerdigkeiten
    +------+------------------+
    | trid | oeffnungszeiten  |
    +------+------------------+
    | 1    | 9:00 - 14:00     |
    +------+------------------+
    | 2    | 8:00 - 20:00     |
    +------+------------------+
    Somit muss ich nur noch die tabelle "tables" erweitern
    Code:
    tables
    +-----+---------------------+
    | tid | name                |
    +-----+---------------------+
    | 3   | sehenswuerdigkeiten |
    +-----+---------------------+
    Und kann dann in der "tables_fields_langs_texts" meine übersetzungen einbauen und problemlos zurückverfolgen
    Code:
    tables_fields_langs_texts
    +-----+-----+-----+-----+------+-------------------+
    | id  | tid | fid | lid | trid | txt               |
    +-----+-----+-----+-----+------+-------------------+
    | 9   | 3   | 1   | 1   | 1    | Eifelturm         | # Tabelle "sehenswuerdigkeiten" feld "name" sprache "de" id "1"
    +-----+-----+-----+-----+------+-------------------+
    | 10  | 3   | 1   | 2   | 1    | eifel tower       | # Tabelle "sehenswuerdigkeiten" feld "name" sprache "en" id "1"
    +-----+-----+-----+-----+------+-------------------+
    | 11  | 3   | 1   | 1   | 2    | freiheitsstatue   | # Tabelle "sehenswuerdigkeiten" feld "name" sprache "de" id "2"
    +-----+-----+-----+-----+------+-------------------+
    | 12  | 3   | 1   | 2   | 2    | statue of liberty | # Tabelle "sehenswuerdigkeiten" feld "name" sprache "en" id "2"
    +-----+-----+-----+-----+------+-------------------+
    Hoffe das jetzt klar ist was ich meine.

    Was ich im Endeffekt wissen will ist ob Ihr Probleme mit der Art des aufbaus seht die ich vielleicht übersehen habe.

    Ein Problem dass z.b. Creator gesehen hat, ist das durchsuchen von so einem Monstrum.
    Als Lösung hat er dann forgeschlagen eine Indextabelle zu erstellen die überflüssige wörter nicht speichert und somit leichter ist.
    Obwohl es meiner meinung nach fraglich ist um wieviel sie leichter wird. Aber dass ist ein anderes Thema, da ich so eine Index Tabelle jederzeit nachrüsten kann.

    Kommentar


    • #32
      ob Ihr Probleme mit der Art des aufbaus seht
      Ja. Es scheint absolut umständlich zu sein.

      In dieser Tabelle stehen alle namen der DB-Tabellen in dennen sprachvariablen vorkommen können.
      Code:
      tables
      +-----+---------+
      | tid | name    |
      +-----+---------+
      | 1   | laender |
      +-----+---------+
      | 2   | staedte |
      +-----+---------+
      Auch mit Beschreibung sehe ich immer noch nicht, was darin stehen soll. Bezeichner wie tid und trid machens auch nicht gerade leichter..

      Die Tabelle tables scheint auf jeden Fall der Fehler im Konzept zu sein. Du kriegst doch niemals mit SQL nen dynamischen JOIN gebastelt, wenn die Tabellennamen im Feld stehen.
      [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


      • #33
        Langsam verstehe ich, was das werden soll. Schau Dir mal OpenGeoDB an, die benutzen ein Prinzip dieser Art:


        Code:
        types
        ID | type
         1   country
         2   city
         3   
         4   sight
         5   area
         6   population
         7   height
        
        
        names
        ID | type | lang | isNativeLang | description
         1    1      de      1            Deutschland
         1    1      en      0            Germany
         2    1      de      0            Frankreich
        47    2      de      0            Paris 
        11    4      en      0            Eiffel tower
        47    2      de      0            Paris 
         2    1      en      0            France
        33    2      de      1            Berlin
        
        
        references
        ID | refID
        47    2
        33    1
        11   47
        
        
        data
        RefID | type | value
         2      6      65447374
        47      5      105.4
        47      6      2193031
        11      7      324.00
        
        .
        Die Daten sind dabei nicht ganz atomar. Z.B. die Angabe isNativeLang. Letzten Endes ist das eine Performancefrage, ob man sich immer durch den kompletyten Baum durchhangeln will. Abhängig davon könntest Du unter references eben auch redundant verlinken - statt Eiffelturm - Paris - Frankreich eben auch Eifelturm - Frankreich.
        [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


        • #34
          Stimmt, mit dem Join hast du recht.
          Ich müsste zwei anfragen senden um erstmal die suche durchzuführen und dann noch eine um die restlichen (nicht mehrsprachigen) daten zu holen.

          Danke erstmal für eure hilfe, bin jetzt erstmal in Urlaub. Danach werde ich mich nochmal hinsetzten und mir über das Problem mit den Joins gedanken machen und mich hier nochmal mit der Lösung oder neuen Problemen melden.

          Danke & Gruß an alle
          Squall

          Kommentar


          • #35
            tabelle_irgendwas
            id | txt1 | txt2 | zahl
            ----------------------
            1 | 992 | 213 | 20.35


            tabelle_lang
            id | lang | txt
            ----------------------
            213 | de | Mahlzeit
            213 | en | Cheers
            ...
            992 | de | Prost
            992 | en | Cheers

            Evtl. Kann man zwei lang Tabellen anlegen, eine "varchar" eine "text"...
            Aber da kommen wir schon in den Bereich Wörterbuch...

            Kommentar


            • #36
              Bin wieder da

              Hab endlich mal wieder Zeit mich hiermit zu beschäftigen.

              @nikosch
              Sieht ganz gut aus. Ich werde mal versuchen es auf diese Art in mein System einzubauen und melde mich dann zurück.

              @phpsecretary
              Dieses Shema habe ich schonmal verwendet:
              Zitat von Squall Beitrag anzeigen
              Eine weitere Idee war es die Sprachen zentral zu speichert.

              lang_titel
              Code:
              +-----+---------+---------+
              | id  | lang    | titel   |
              +-----+---------+---------+
              | int | varchar | varchar |
              +-----+---------+---------+
              lang_text
              Code:
              +-----+---------+------+
              | id  | lang    | text |
              +-----+---------+------+
              | int | varchar | text |
              +-----+---------+------+
              irgendeine_tabelle
              Code:
              +-----+---------------+--------------+
              | id  | lang_titel_id | lang_text_id |
              +-----+---------------+--------------+
              | int | int           | int          |
              +-----+---------------+--------------+
              Problem:
              Als irgendwann eine Suchfunktion zur Debatte stand, musste ich feststellen dass ich über alle Tabellen gehen muss um z.b. herauszufinden wo der lang_text mit der id 5 verknüpft ist. Also auch Schrott!

              Kommentar


              • #37
                Hi Squal
                Ich habe mit grossm Interesse diesen Thread gelesen und würde dich gerne 2 Jahre nach deinem letzten Eintrag um ein kurzes Fazit bitten.

                Welche Erfahrung hast du mit der Lösung von Nikosch gemacht? Bist du bei der Lösung geblieben oder hast du ein neues Konzept gefunden / verfolgt? Gibt es Ergänzungen zum verwendeten Ansatz?

                Danke und Gruss
                Dblue

                Kommentar


                • #38
                  Ein Fazit?
                  Zum Text-Suchen ist MySQL sowieso ungeeignet. Dafür benutzt man geeignetere Mittel (Lucene)

                  Kommentar


                  • #39
                    Was hat das bitte mit der Frage zu tun?
                    [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


                    • #40
                      Zitat von nikosch Beitrag anzeigen
                      Was hat das bitte mit der Frage zu tun?
                      Dblue hat gefragt:

                      Zitat von dblue Beitrag anzeigen
                      Gibt es Ergänzungen zum verwendeten Ansatz?
                      Im Thread ging es ua. auch um die Suche:

                      Zitat von Squall Beitrag anzeigen
                      ...
                      Problem meiner alten Sprachensteuerung lag daran das bei einer suche in der sprachen Tabelle ich zwar ergebnisse hatte diese aber nur mühsam zuordnen konnte da es in der Sprachtabelle keine backlinks gab. Dieses Problem hat sich ja mit dem Besipiel von chorn:
                      ...
                      erledigt. Darauß resultiert für mich eben nur noch die Frage, ob sich mit dieser Struktur andere Probleme ergeben oder es noch bessere/andere Lösungen gibt. Wie schon erwähnt bin ich mit Sprachen schon 2 mal auf die Fresse geflogen und würde es daher gerne diesmal vermeiden.
                      Mein post ist eine "Ergänzungen zum verwendeten Ansatz" und somit in der Menge der gültigen Antworten (IMHO).

                      Kommentar


                      • #41
                        Zitat von nikosch Beitrag anzeigen
                        Was hat das bitte mit der Frage zu tun?
                        Danke für den Hinweis. Selbstverständlich ist es sinnvoll für die Suche in grösseren Textmengen auf Lucene zurück zugreifen.

                        Im Thread resp. meiner Fragestellung geht es aber um Datenbankdesign und das Handling von mehrsprachigen, strukturierten Daten.

                        Kommentar

                        Lädt...
                        X