sql >> Databasteknik >  >> RDS >> Mysql

Databasmodellering för internationella och flerspråkiga ändamål

Så här skulle jag designa databasen:

Visualisering av DB Designer Fork

i18n Tabell innehåller bara en PK, så att vilken tabell som helst måste bara referera till denna PK för att internationalisera ett fält. Tabellen translation är sedan ansvarig för att länka detta generiska ID med den korrekta listan med översättningar.

locale.id_locale är en VARCHAR(5) för att hantera båda en och en_US ISO-syntaxer .

currency.id_currency är en CHAR(3) för att hantera ISO 4217-syntaxen .

Du kan hitta två exempel:page och newsletter . Båda dessa adminhanterade enheter måste internationalisera sina fält, respektive title/description och subject/content .

Här är ett exempel på en fråga:

select
  t_subject.tx_translation as subject,
  t_content.tx_translation as content

from newsletter n

-- join for subject
inner join translation t_subject
  on t_subject.id_i18n = n.i18n_subject

-- join for content
inner join translation t_content
  on t_content.id_i18n = n.i18n_content

inner join locale l

  -- condition for subject
  on l.id_locale = t_subject.id_locale

  -- condition for content
  and l.id_locale = t_content.id_locale

-- locale condition
where l.id_locale = 'en_GB'

  -- other conditions
  and n.id_newsletter = 1

Observera att detta är en normaliserad datamodell. Om du har en enorm datauppsättning kanske du kan tänka på att avnormalisera den för att optimera dina frågor. Du kan också leka med index för att förbättra sökresultaten (i vissa DB indexeras främmande nycklar automatiskt, t.ex. MySQL/InnoDB ).



  1. frågetabell varje sekund för avisering. Är det en bra praxis?

  2. Skillnad mellan att använda REFERENSER med och utan UTLÄNDSK NYCKEL?

  3. Lighty för Oracle

  4. Tvinga viloläge för att skapa tabeller efter att ha släppt och återskapat databasen