Нам нужно отображать название нашего продукта на разных языках, но только некоторые из них имеют названия на разных языках, чем английский.Когда мы запрашиваем продукты с определенным языком, мы хотим показать имя по умолчанию на английском языке, если имя определенного языка отсутствует.
Чтобы получить лучшую производительность запросов, мы должны заполнить английское имя по умолчанию в таблице имен продуктов, зависящих от языка (languageid + productid - это первичный ключ), когда имя для определенного языка отсутствует.Он сделал много повторяющихся имен в этой языковой таблице, и немного сложно обновить эту таблицу, когда английское имя по умолчанию изменилось.
В настоящее время у нас около 300 000 продуктов с 30 языками и более 8 000 000 строк в этой таблице, по крайней мере, более 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)