我們需要以不同的語言顯示我們的產品名稱,但只有其中一些名稱的語言不同於英語。當我們查詢某種語言的產品時,如果缺少特定的語言名稱,我們希望以英文顯示默認名稱。重複數據或更好的性能?
爲了獲得更好的查詢性能,當缺少特定語言的名稱時,我們必須將默認英文名稱填充到語言相關產品名稱表(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)
你可以把當前表架構在你的文章? – 2011-03-02 20:29:28