Newsgroup: it.comp.www.php
Titolo: layout DB per dati multilingua da PHP

Ciao,
so che sono leggermente OT, ma mi piacerebbe avere una vostra opinione su
un problema. Il post sembra lungo ma in realta` non lo e`, sono tutti
esempi. :)
Mettiamo di avere un sito multilingua. L'amministratore del sito puo`
inserire contenuti dinamici (diciamo le news, per esempio) in piu` lingue.
Ci sono diversi modi per implementare il DB.
Il primo e` di mettere tutto nella stessa tabella:
create table news (
  id primary key,
  data date,
  titolo_it varchar(255),
  testo_it text,
  titolo_en varchar(255),
  testo_en text,
  ...
)
Il secondo e` di separare tutto:
craete table news_it (
  id primary key,
  data date,
  titolo varchar(255),
  testo text
)
create table news_en ( ...)
...
Il terzo e` di unire tutto ma distinguere nella riga:
create table news (
  id primary key,
  lingua varchar(2),
  titolo varchar(255),
  testo text
)
Il quarto e` di usare una tabella di metadati:
create table news (
  id primary key,
  data date
)
create table news_it (
  id references(
news.id
),
  titolo varchar(255)
  testo text
)
create table news_en (
 ...
)
e alla fine fare delle left/right join per ricavare le news nella lingua
desiderata.
Vorrei chiedervi quale sia il sistema che preferite e le motivazioni che
vi hanno spinto a sceglierlo.
Se avete sistemi diversi, aggiungeteli pure, non si finisce mai di
imparare. :)
Grazie.

 Grazie.
MTC,
David
-- 
         Linux Registered User #334216
Get FireFox! >> 
http://snipurl.com/gofoxygo/
 <<
Blog         >>  
http://www.hanskalabs.net/
  <<
Staff        >> 
http://www.debianizzati.org/
 <<

 )
questo senza dubbi, è il più logico

 [it]notizia in italiano[/it][en]news in english[/en]
E se la news al suo interno contiene qualcosa tipo [it]?
--
rob4you

 Grazie.
ps: io da te ho solo da imparare, quindi caso mai sono io che ti dico 
grazie. ;-)
--
rob4you

 E se la news al suo interno contiene qualcosa tipo [it]?
Uhm... non dovrebbe creare problemi, in quanto con la regex si dovrebbe
riuscire a prendere il testo tra [(qualcosa1)] [/(qualcosa1)]. Quindi,
se c'è una cosa del tipo:
[(qualcosa1)] testo [(qualcosa2)] altrotesto [/(qualcosa1]
dovrebbe essere possibile avere:
testo [(qualcosa2)] altrotesto
Non ne sono sicurissimo, non sono un guru delle regex :)
Cheers,


 
Io strutturerei il db così con tre tabelle :
Notizie
_______
IdNotizia
DescrNotizia
Autore
Data
Lingue
________
IdLingua
DescrLingua
NotiziaLingue
_____________
IdNotizia
IdLingua
Titolo
Testo
Ciao

 testo [(qualcosa2)] altrotesto
In questo caso in effetti, lavorando di regex, di riuscirebbe ad 
arrivare alla soluzione voluta.
Ma non risolverebbe il problema seguente:
[(qualcosa1)] testo [/(qualcosa1)] altrotesto [/(qualcosa1]
in quanto restituirebbe solo:
testo
Beh certo, il caso da me presentato è alquanto improbabile (perché mai 
in una news dovrebbe esserci scritto [/it] oppure [/en]? Magari [it] 
sarebbe stato più probabile, volendo come acronimo di: Information 
Technology, ma.....fosse mai che capita... ;-) )
--
rob4you

 Grazie.
direi il tre ma con una piccola modifica..
la chiave primaria dovrebbere comprendere sia id che lingua (non in
quest'ordine se non erro)..
i punti a favore saranno che in questo modo un solo id identifica la stessa
news in piu' lingue e questo puo' essere conveniente.. oltretutto ti
facilita anche il compito di capire se una news e' gia' stata tradotta (se
non ho equivocato il problema) e quante news sono presenti
indifferentemente dalle lingue.. etc..
i punti a sfavore saranno una gestione leggermente piu' complicata
dell'inserimento di nuove news, traduzioni etc.. etc..
e comunque non dichiarare un campo varchar(2).. sarebbe meglio dichiararlo
char(2)..
-- 
www.iuz-lab.info


Sostituisci in inserimento [ con [] o qualcosa del genere,
di molto improbabile da inserire in una news e quando
stampi la news lo sostituisci cancelli ogni ] che viene
subito dopo [. Spero di essere stato chiaro.
Mi pare che la tecnica si chiami character stuffing.
Ciao
Franco