2011-09-01 129 views
1

什麼是本地化數據庫表的最佳方式,舉例如一個國家?如何本地化數據庫表

1個平表

CountryID|Code|NameEN|NameIT 
---------------------------- 
1  |IT |Italy |Italia 

SELECT CountryID, Code, NameEN AS Name 
FROM Countries 

2聯接表

CountryID|Code 
-------------- 
1  |IT 

CountryID|LocalizationCode|Name 
--------------------------------- 
1  |EN    |Italy 
--------------------------------- 
2  |IT    |Italia 

SELECT CountryID, Code, Name 
FROM Countries INNER JOIN CountriesLoc ON Countries.CountryID = CountriesLocs.CountryID 
WHERE LocalizationCode = 'EN' 

謝謝!

+1

嗯,這取決於。你會有多少種語言?或者只是英文和國家的語言? – NullUserException

+0

可能有任何數量的語言。例如,想象一下電子商務後端。 – Alessandro

+1

然後去第二個選項 – NullUserException

回答

2

我建議用第二個選項去,但你似乎有一些數據輸入錯誤。

國家:

Id Code 
=============== 
1 IT 

Localized_Country:

CountryId LanguageCode LocalizedName 
========================================= 
1   IT   Italia 
1   EN   Italy 

你再查詢,像這樣:

SELECT a.Id, b.LocalizedName 
FROM Country as a 
JOIN Localized_Country as b 
ON b.CountryId = a.Id 
AND b.LanguageCode = :InputLanguageCode 
WHERE a.Code = :InputInternationalCountryCode 

換行(或類似的東西),在視圖中了,你'金色。

一些建議:
您可能要推Language(或一些其他類型的Locale概念)到它自己的表。該鍵可以是自動遞增值,或者是國際字符,對於哪一個來說並不重要。
請確保在(CountryId, LanguageCode)上加上一個唯一的約束,以防萬一。永遠不要忘記你的外鍵。

+0

爲什麼要添加「在哪裏。代碼=:InputInternationalCountryCode「? – Alessandro

+0

因爲我需要一些東西來說明我正在談論哪個國家,這與語言/本地化無關。對於國家來說,這將是ISO標準代碼(2/3字母)。所有國家的名單,然後我會放棄它,你沒有提供最終的應用程序,但是對於一個網站,你將通過國家ISO參數的國際編碼。 –

+0

是的,這是正確的,謝謝! – Alessandro

1

我會隨着第二個,它更靈活,只要記住在第二個表中的CountryId列創建索引。

我剛纔注意到您的查詢:

SELECT CountryID, Code, Name 
FROM Countries INNER JOIN CountriesLoc ON Countries.CountryID = CountriesLocs.CountryID 
WHERE LocalizationCode = 'EN' 

爲什麼要補充

其中LocalizationCode = 'EN'

你認爲對國家意大利可不止一種語言?

EDITED

SELECT CountryID, Code, Name 
FROM Countries INNER JOIN CountriesLoc ON Countries.CountryID = CountriesLocs.CountryID 
WHERE Code = 'EN' 
+0

因爲如果我在意大利語中使用前端,我想輸出「意大利語」,否則在英語中我想輸出「意大利語」。 – Alessandro

+0

好吧,我明白了。但後來我認爲效率更高的是過濾代碼列 - 請參閱我編輯的答案sql –

+0

但是「代碼」永遠不會是'EN',因爲意大利的國際代碼是'IT'。對不起,我的例子並不是非常有用...... – Alessandro