Qual è un modo consigliato di progettare uno schema db per il sito Web multilingue?

3

Sto costruendo un sito web in cui prevedo di supportare più lingue. Non solo tramite l'interfaccia utente, ma anche tramite il contenuto.

Ho diverse tabelle in cui ho colonne di testo come "titolo", "nome", "descrizione", "corpo" e così via. Qual è il modo migliore per farlo? Dovrò creare una tabella aggiuntiva per ognuno di essi in cui sono presenti dati di testo che voglio tradurre? Ad esempio:

articles(id)
articles_content(article_id, title, description, body, language_id)


comments(id)
comments_content(comment_id, body, language_id)

E quindi per ogni tabella che voglio tradurre.

Qualunque aspetto negativo di questa soluzione?

C'è un modo migliore e ancora più semplice?

    
posta Raj 06.02.2018 - 17:07
fonte

2 risposte

1

Crea ogni "tabella" come una tabella di base (con gli elementi non traducibili) e una tabella di traduzione. La tabella della lingua conterrà la chiave primaria della tabella di base e l'ID della lingua. È quindi possibile creare un livello di vista che unisce i due insieme per una lingua specifica (e che l'interfaccia utente interromperà). Questo scenario evita la manutenzione duplicata degli elementi non traducibili.

    
risposta data 09.02.2018 - 02:01
fonte
0

Suggerirei di non disporre di una tabella multilingue separata per tabella di base. Ti consigliamo di avere una tabella singola che rappresenta una stringa multilingue e una tabella singola per archiviare il valore di quella stringa in ogni lingua.

Ad esempio, le istruzioni create per la tabella per Postgres potrebbero essere:

create table articles (
    id serial primary key,
    title int not null references multilingual (id),
    description int not null references multilingual (id),
    body int not null references multilingual (id)
);

create table multilingual (
    id serial primary key
);

create table string (
    id int not null references multilingual (id),
    lang lang not null, -- custom lang type defined as enum
    contents text not null,
    primary key (id, lang)
);

articles_content(article_id, title, description, body, language_id)

Questo approccio richiede più join della tabella multilingue per tabella di base, quindi potrebbe degradare le prestazioni in modo inaccettabile. Tuttavia, mantiene lo schema più semplice.

    
risposta data 10.05.2018 - 16:42
fonte