Sql-Server

您是否認為有必要為只有兩個元素(id 和 name)的表創建一個輔助翻譯表

  • April 1, 2020

我有個問題。

在我的數據庫中,我有一個過敏原表,其中包含兩個元素:Id 和 Name。

我希望我的過敏原表有翻譯,那麼什麼更好?創建一個名稱可以是 AllergenTranslate 的輔助翻譯表,或者直接在表 Allergen 中創建 langungeId 並將其名稱更改為 AllergenTranslate。

例子:

CREATE TABLE [Allergen] (
 [Id] int PRIMARY KEY IDENTITY(1, 1)
)

CREATE TABLE [AllergenTranslation] (
 [Id] int PRIMARY KEY IDENTITY(1, 1)
 [AllergenId] int,
 [LanguageId] int,
 [Name] nvarchar(255),
)

或直接過敏原翻譯表

CREATE TABLE [AllergenTranslation] (
 [Id] int PRIMARY KEY IDENTITY(1, 1)
 [LanguageId] int,
 [Name] nvarchar(255),
)

或直接過敏原表沒有翻譯表名稱

CREATE TABLE [Allergen] (
 [Id] int PRIMARY KEY IDENTITY(1, 1)
 [LanguageId] int,
 [Name] nvarchar(255),
)

絕對是第一個同時具有 Allergen 和 AllergenTranslation 表的表。

原因是過敏原很可能在其他地方被引用。假設您有一張藥物表,每種藥物都對部分過敏原有效。這個功效表中的外鍵是什麼?您根本不希望 FK 中包含 LanguageId - 藥物的反應不以患者的言語為條件。您也不想為每種語言重複 Efficacy 中的行,因為這是導致重複和錯誤的冗餘。想想引入另一種語言所需的更改。

在大多數情況下,這將取決於使用頻率以及同一過敏原需要多語言的頻率。除非這將成為您的應用程序的基石(即 90% 以上的事務將使用的事務表或某種查找表),否則我不會想太多。我以前聽過它說:

…過早的優化是萬惡之源…

維基百科 - 過早的優化

話雖如此,在我個人看來,我會把你的名字和你的實際過敏原分開。因為它們是兩個不同的數據元素。您可能希望能夠通過過敏原而不是名稱來建構程式碼和查詢數據。

EX:您將希望圍繞對乳膠過敏的人(英文)編寫程式碼/報告,並使用通用名稱/ID/程式碼引用它們。您很可能不想在後端引用它的所有各種名稱(隨著此應用程序使用的語言/國家/地區數量的增加,名稱也會增加)。

如果是我實施解決方案,我將有兩個單獨的表AllergenAllergenTranslation. 我會做類似你上面的事情。我建議您使用某種通用名稱或程式碼,這些名稱或程式碼要麼總是相同的語言,要麼語言不明確。這樣,當您將這些記錄從一個環境移動到另一個環境時,您不必確保數字 IDAllergen.Id在各個環境中是相同的,並且您不必保留每個 ID 含義的列表。就像是:

CREATE TABLE [Allergen] (
 [Id] int PRIMARY KEY IDENTITY(1, 1),
 [CommonName\Code] nvarchar(255) NOT NULL UNIQUE
)

CREATE TABLE [AllergenTranslation] (
 [Id] int PRIMARY KEY IDENTITY(1, 1)
 [AllergenId] int,
 [LanguageId] int,
 [Name] nvarchar(255),
)

CommonName\Code如果您始終至少有一條記錄,您總是可以滿足該列的需求

$$ AllergenTranslation $$. 我個人不希望這是一個要求(但我也在一個基本上只用英語工作的環境中工作)。 讓我知道是否可以提供更多幫助,或者其中任何部分沒有意義。

引用自:https://dba.stackexchange.com/questions/262747