2011-03-02 73 views
0

我們需要以不同的語言顯示我們的產品名稱,但只有其中一些名稱的語言不同於英語。當我們查詢某種語言的產品時,如果缺少特定的語言名稱,我們希望以英文顯示默認名稱。重複數據或更好的性能?

爲了獲得更好的查詢性能,當缺少特定語言的名稱時,我們必須將默認英文名稱填充到語言相關產品名稱表(languageid + productid是主鍵)。它在這個依賴於語言的表中創建了許多重複名稱,並且在默認英文名稱更改時更新此表有點困難。

目前,本表中約有30萬種產品,約30種語言,超過800萬行,至少有超過90%的數據是重複的,並填入默認英文名稱。但是,如果我們在查詢中使用左連接和isnull檢查,則查詢性能會更慢。

誰能爲我推薦一個更好的數據庫設計,以避免填充重複數據並獲得更好的查詢性能?

當前表的模式類似下面

Table1 (about 300,000 rows) 
ProductId | Country  | Currency | others fields 
------------|----------------|-----------|--------------- 
Product A | US    | USD  | ... 
Product B | GB    | GBP  | ... 

Table2 (about 9,000,000 rows) 
LanguageId | ProductId  | Product Name 
------------|----------------|-------------------------- 
English  | Product A  | Product A Name 
English  | Product B  | Product B Name 
German  | Product A  | Produkt A Name 
German  | Product B  | Product B Name (it's filled by English name) 

我曾嘗試以下查詢,以避免重複的數據,但表現卻有點最差。

SELECT 
    A.ProductId, 
    A.Country, 
    ISNULL(B1.ProductName, B2.ProductName) as ProductName 
FROM 
    Table1 A (NOLOCK) 
    LEFT JOIN Table2 B1 (NOLOCK) on A.ProductId = B1.ProductId 
    LEFT JOIN Table2 B2 (NOLOCK) on A.ProductId = B2.ProductId and B2.LanguageId = 'ENGLISH' 
WHERE 
    B1.LanguageId = 'German' 
ORDER BY 
    ISNULL(B1.ProductName, B2.ProductName) 
+0

你可以把當前表架構在你的文章? – 2011-03-02 20:29:28

回答

1

我不知道這是可行的您的具體情況,但爲什麼不讓UI界面層或應用層通過一個共同的定位模式處理的翻譯?

+0

很難在UI層進行本地化,因爲我們還需要按產品名稱字段排序。 – CodeRhino 2011-03-03 17:40:24

+0

@CodeRhino,值得關注。但是,仍然可能在應用程序層使用本地化? – 2011-03-03 17:41:57

+0

當我只想在頁面中顯示指定的產品時,很容易在應用程序層處理本地化。但是,當我想要搜索和分頁超過300,000種產品並按產品名稱顯示結果和排序時,我應該如何處理這些問題。 – CodeRhino 2011-03-03 18:25:10

0

如果在該語言記錄中沒有產品名稱,請在該字段中輸入NULL。當您執行查詢時,請使用COALESCENULL替換爲英文產品名稱。

SELECT COALESCE(l.ProductName, 'Product Name') 
FROM Language l 

我提出的設計會是這個樣子:

Language | ProductName | TitleMenu 
---------------------------------- 
English | Widgetizer | Title 
French | La Widgette | La Title 
Spanish |    | El Title 

由於西班牙有一個NULL進入,COALESCE跳過空,在默認的產品名稱放。

+0

所以你建議2列並保留重複的英文名稱? – gbn 2011-03-02 20:36:57

2

您是否測試了LEFT JOIN和ISNULL?或者這只是一個猜測?鑑於你正在轉移大量的數據,我會說可選語言行會更快,除非你有一些非常糟糕的索引

SELECT 
    ..., 
    ISNULL(L.languageproductName, P.productname) 
FROM 
    Product P 
    LEFT JOIN 
    LangaugeStuff L ON P.productID = L.productID AND L.languageID = @Mylanguage 
+0

我在我的查詢中嘗試了LEFT JOIN和ISNULL。因爲我們還需要按產品名稱對數據進行排序。它慢得多。 – CodeRhino 2011-03-03 17:39:30

相關問題