Eu tenho que desenvolver um CMS que suporte dois idiomas em inglês, o árabe. Este CMS será uma espécie de site de Publicação de Artigo. Ao projetar e analisar, descobri que alguns artigos têm mais de 8000 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 PageBody como nvarchar (4000), então eu estou limitado a 4000 caracteres e se eu tiver que armazenar a versão em árabe, preciso de 16000 bytes (como o árabe é Unicode e ocupa 3 vezes mais espaço que o ASCII).
Então, eu só tenho a opção de definir PageBody como nVarchar (max) , isso terá o lado negativo do ponto de vista do desempenho. Minha pergunta real é se alguns dados na coluna PageBody têm menos de 4000 caracteres, será MS SQL Store do que dados na coluna embutida 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 esse projeto de CMS multilíngue são bem-vindas.
Preciso suportar apenas dois idiomas Árabe e Inglês
fonte
Respostas:
Um
nvarchar(max)
valor será armazenado " em linha " se for curto o suficiente.O comportamento padrão pode ser modificado usando a opção sp_tableoption , "tipos de valores grandes fora da linha". Eu não me incomodaria. O mecanismo de banco de dados gerenciará isso de forma eficiente 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 de no nível da coluna
Permite permitir mais linhas por página e mais chances de armazenamento LOB em linha
PageParent
PageEnglish (note que varchar pode estar OK aqui)
PageArabic
2. Linhas separadas
Ou tenha uma coluna languageID para suportar vários idiomas.
Isso tem a desvantagem de que o agrupamento será corrigido para todos os idiomas, o que significa má classificação / filtragem
PageParent
Página
fonte
Isso significa que, para que tudo se encaixe 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 precisará ajustar o texto em inglês e o árabe na mesma linha, e isso também faria sentido ao buscar dados, pois provavelmente você não precisaria buscar inglês e árabe ao mesmo tempo.
fonte