Ich bin mir nicht sicher, warum Sie sich Sorgen um die Anzahl der Tabellen machen:Weniger Tabellen bedeuten nicht automatisch, dass Ihre Datenbank kleiner, effizienter oder besser gestaltet ist. Besonders wenn die Verringerung der Anzahl der Tabellen die Komplexität Ihrer Abfragen erhöht, wäre ich sehr vorsichtig damit.
Wie auch immer, ich würde für eine Übersetzungstabelle pro 'Basis'-Tabelle gehen. Der Hauptgrund ist, dass Ihre zweite Lösung nicht flexibel ist:Wenn der Primärschlüssel keine einzelne Ganzzahl ist, wird es extrem schwierig, ihn zu implementieren und zu verwenden. Das Abfragen nach Übersetzungen ist ebenfalls komplexer und je nach Größe der Tabelle und der Daten kann es schwierig sein, sie effektiv zu indizieren.
Es ist nicht klar, warum Sie eine TranslationID
haben auf den Products
Tisch; normalerweise ist die Beziehung umgekehrt:
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)
)
Abhängig von Ihrem Toolset und Bereitstellungsprozess möchten Sie möglicherweise Übersetzungstabellen direkt aus den Basistabellen als Teil Ihres Datenbankaufbaus generieren. Und Sie können Views verwenden, um eine praktische, „vollständig übersetzte“ Version der Basistabelle bereitzustellen.
Eine interessante Frage ist, welche Sprache für die Spalten in Products
verwendet wird und ob sie direkt verwendet werden können, wenn keine Übersetzung erforderlich ist. Mein Vorschlag wäre, dass der gesamte Produktionscode einen Sprachparameter übergeben und den Text aus ProductsTranslations
übernehmen sollte nur Tabelle, auch für Englisch (oder was auch immer Ihre interne Unternehmenssprache ist). Auf diese Weise können Sie sicher sein, dass alle „offiziellen“ Namen in derselben Tabelle gefunden werden, und die Spalten in der Basistabelle dienen der Klarheit und Vollständigkeit des Datenmodells sowie der Entwicklerfreundlichkeit und (möglicherweise) internen Verwendung auf Ad-hoc-Basis Berichte und so weiter.