簡體   English   中英

數據庫本地化

[英]Database localization

我有許多數據庫表,其中包含需要本地化的namedescription列。 我最初嘗試設計一個支持這種情況的數據庫模式是這樣的:

product
-------
id
name
description


local_product
-------
id
product_id
local_name
local_description
locale_id


locale
------
id
locale

但是,此解決方案需要為包含需要localization name和描述列的每個表創建一個新的local_ table。 為了避免這種開銷,我重新設計了模式,因此只需要一個localization

product
-------
id
localization_id


localization    
-------
id    
local_name
local_description
locale_id


locale
------
id
locale

以下是有2個表(產品和國家/地區)需要本地化時將存儲在此模式中的數據示例:

國家

id,     localization_id
-----------------------
1,      5

產品

id,     localization_id
-----------------------
1,      2

本土化

id,     local_name,   local_description,     locale_id
------------------------------------------------------
2,      apple,        a delicious fruit,     2
2,      pomme,        un fruit délicieux,    3
2,      apfel,        ein köstliches Obst,   4
5,      ireland,      a small country,       2
5,      irlande,      un petite pay,         3

現場

id,     locale
--------------
2,      en
3,      fr
4,      de

請注意, localization表的復合主鍵是(id, locale_id) ,但product表中的外鍵僅指該復合PK的第一個元素。 從標准化的POV來看,這似乎是一件“壞事”。

有什么方法可以解決這個問題,或者,是否有一個完全不同的架構支持本地化而不為每個可本地化的表創建單獨的表?

更新:許多受訪者提出了一種解決方案,需要為每個可本地化的表創建單獨的表。 但是,這正是我想要避免的。 我上面提出的模式幾乎解決了我滿意的問題,但我對於localization_id外鍵僅引用localization表中相應主鍵的一部分這一事實感到不滿。

謝謝,唐

我認為沒關系。 您描述的是產品與其本地化文本之間的一對多關系。

我想知道你是否也應該將英語本地化而不是在產品表中對其進行非規范化。

我喜歡這個想法,但是會向另一個方向邁出一步,並為每個已翻譯的列提供本地化條目:

國家

id,     localization_id
-----------------------
1,      5

產品

id,     name_locale_id,  description_locale_id
----------------------------------------------
1,      2,               8

本土化

id,     locale_id,    value
------------------------------------------------------
2,      2             apple
2,      3             pomme
2,      4             apfel
5,      2             ireland
5,      3             irlande
8,      2             a delicious fruit
8,      3             un fruit délicieux
8,      4             ein köstliches Obst
9,      2             a small country
9,      3             un petite pay

現場

id,     locale
--------------
2,      en
3,      fr
4,      de

本地化的PK是(id,locale_id)。 id也是其他幾個表中的FK引用也沒問題。 您可以根據需要添加代理PK,只要您在(id,locale_id)上仍有唯一索引即可。

關於這一點的好處是它是一個單一的本地化表,它適用於模式中的任何表,無論它具有哪些字段(您不僅限於具有本地化的任何名稱和描述)。 不利的一面是使用本地化表時潛在的性能損失 - 盡管可能只是為給定的locale_id緩存整個事物,所以當你查找條目時,你只需要查找給定的id(因為你的緩存是已經基於語言鍵入)。

您還可以考慮在產品表中保留默認名稱和描述字段,以便在當前語言缺少條目時使用,或者在輸入時,用戶未指定語言。 如果您移植現有應用程序也是如此,您已經擁有了值(沒有區域設置信息)。

我認為,正確的方法是創建額外的表,但是然后執行額外的步驟並從第一個表中刪除所有特定於語言的資源。

所以你有:

產品

id 
-name removed
-description removed

產品本地化

productid, locale_id, name,   description
------------------------------------------------------
1,         3,         pomme,  un fruit délicieux
1,         4,         apfel,  ein köstliches Obst
1,         1,         apple,  a delicious fruit

現場

id,     locale
--------------
1,      en
3,      fr
4,      de

如果我理解正確,那么您的問題僅僅是因為您希望在多個表中使用相同的語言本地化名稱和描述。 在這種情況下,您無法在本地化表中添加prod_id。 您的設計中的另一個問題是,它無法優雅地處理同一產品的多個語言本地化。 你可以調整它工作:

如果名稱和描述是唯一需要本地化的字段,則可以執行以下操作。

產品(ID,名稱,描述,tanslation_row_id)

Product_translations(ID,名稱,描述,lang_id,translation_id)

translation_row_id將是指向Product_translations.ID的外鍵。然而,translation_id將指向同一個表中的父記錄,該父記錄將用作所有語言特定記錄的公共記錄。

示例記錄

產品

(ID, name, description, translation_row_id)
(p1, apples,a red fruit, tr1)
(p2, mango, a yellow fruit, tr2)

Product_translations

(ID, name, description, lang_id, translation_id)
(tr1, apples, a red fruit, ENU, null)
(tr2, mango, a yellow fruit, null)
(tr3, pomme,un fruit rouge, FRA,tr1)
(tr4, mangue,a yellow fruit, SPA,tr2)

給定語言代碼,您可以使用foll SQL查詢提取名稱和描述值

select T.name, T.description
from product_translations T 
where T.translation_id = 
     (select T2.ID 
      from Product P,Product_translations T2 
      where P.translation_row_id = t2.ID
      ) 
     and T.lang_id = '&langID';

重要說明:我假設產品表具有更多不需要此轉換的屬性。 '&langID'是SQL查詢的參數,用於詢問用戶所選擇的語言代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM