Eu tenho que desenvolver um CMS que suporte dois idiomas: inglês, árabe. Este CMS será uma espécie de site de publicação de artigos. Ao projetar e analisar, descobri que alguns artigos têm mais de 8.000 caracteres. Minha tabela tem alguma coluna como
PageID int,
PageTitleEnglish nvarchar(200),
PageTitleArabic nvarchar(200),
PageDescEnglish nvarchar(500),
PageDescArabic nvarchar(500),
PageBodyEnglish nvarchar(max)
PageBodyArabic nvarchar(max)
Se eu mantiver o PageBody como nvarchar (4000) , será limitado a 4.000 caracteres e, se tiver que armazenar a versão em árabe, precisarei de 16.000 bytes (como o árabe é Unicode e ocupa 3 vezes mais espaço do que o ASCII).
Portanto, só me resta a opção de definir PageBody como nVarchar(max) . Isso terá uma desvantagem do ponto de vista do desempenho. Minha pergunta real é se alguns dados na coluna PageBody tiverem menos de 4.000 caracteres, será MS SQL Store do que dados na coluna inline ou separadamente no banco de dados.
Também procurei isso no Google, mas não encontrei nenhuma resposta relevante e como posso melhorar o desempenho nesse cenário.
Quaisquer sugestões de melhores práticas para tal projeto de CMS multilíngue são bem-vindas.
Preciso oferecer suporte a apenas dois idiomas, árabe e inglês
Um
nvarchar(max)
valor será armazenado " in-row " se for curto o suficiente.O comportamento padrão pode ser modificado usando sp_tableoption , opção "tipos de valor grande fora da linha". Eu não me incomodaria. O mecanismo de banco de dados gerenciará isso com eficiência por si só.
Quanto ao design, existem várias maneiras de fazer isso com base no seu modelo:
1. Mesas separadas
Ou seja, você pode dividir os idiomas separados em tabelas diferentes.
Isso permite agrupamentos no nível da tabela em vez dos no nível da coluna
Ele permite mais linhas por página e mais chance de armazenamento LOB em linha
PáginaPai
PageEnglish (observe que varchar pode estar OK aqui)
Páginaárabe
2. Linhas separadas
Ou tenha uma coluna languageID para oferecer suporte a vários idiomas.
Isso tem a desvantagem de que o agrupamento será corrigido para todos os idiomas, o que significa uma classificação/filtragem ruim
PáginaPai
Página
Isso significa que, para que tudo caiba em uma linha, a soma de todos os tamanhos deve ser menor que 8K. Caso contrário, o SQL Server armazenará os BLOBs fora da linha/página.
As quantidades de dados são tão grandes que isso realmente causa um problema de desempenho?
Como outra opção, talvez você possa alterar sua estrutura de banco de dados para ter linhas separadas para páginas em inglês e árabe e incluir uma coluna de código de idioma. Então você não terá que ajustar o texto em inglês e árabe na mesma linha, e isso também faria sentido ao buscar dados, já que você provavelmente não precisaria buscar inglês e árabe ao mesmo tempo.