Non sono sicuro del motivo per cui sei preoccupato per il numero di tabelle:avere meno tabelle non significa automaticamente che il tuo database sia più piccolo, più efficiente o progettato meglio. Soprattutto se la riduzione del numero di tabelle aumenta la complessità delle tue query, starei molto attento a farlo.
Ad ogni modo, sceglierei una tabella di traduzione per tabella "base". Il motivo principale è che la tua seconda soluzione non è flessibile:se la chiave primaria non è un singolo intero, diventa estremamente difficile da implementare e utilizzare. Anche la ricerca delle traduzioni è più complessa e, a seconda delle dimensioni della tabella e dei dati, potrebbe essere difficile indicizzarla in modo efficace.
Non è chiaro il motivo per cui hai un TranslationID
sui Products
tavolo; di solito la relazione è il contrario:
create table dbo.Products (
ProductCode char(10) not null primary key,
ProductName nvarchar(50) not null,
ProductDescription nvarchar(100) not null,
-- other columns
)
create table dbo.ProductsTranslations (
ProductCode char(10) not null,
LanguageCode char(2) not null,
ProductName nvarchar(50) not null,
ProductDescription nvarchar(100) not null,
-- other translations
constraint FK1 foreign key (ProductCode)
references dbo.Products (ProductCode),
constraint FK2 foreign key (LanguageCode)
references dbo.Languages (LanguageCode),
constraint PK primary key (ProductCode, LanguageCode)
)
A seconda del set di strumenti e del processo di distribuzione, potresti voler generare tabelle di traduzione direttamente da quelle di base come parte della creazione del database. Inoltre, puoi utilizzare le viste per fornire una comoda versione "completamente tradotta" della tabella di base.
Una domanda interessante è quale lingua viene utilizzata per le colonne in Products
e se possono essere utilizzati direttamente quando non è richiesta la traduzione. Il mio suggerimento sarebbe che tutto il codice di produzione dovrebbe passare un parametro di lingua e prendere il testo da ProductsTranslations
solo tabella, anche per l'inglese (o qualunque sia la lingua aziendale interna). In questo modo puoi essere sicuro che tutti i nomi "ufficiali" si trovano nella stessa tabella e che le colonne nella tabella di base siano presenti per chiarezza e completezza del modello di dati, nonché per comodità dello sviluppatore e (possibilmente) uso interno su ad hoc rapporti e così via.