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 ).