Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Quando é melhor armazenar sinalizadores como uma máscara de bits em vez de usar uma tabela associativa?


Pergunta esplêndida!

Em primeiro lugar, vamos fazer algumas suposições sobre "melhor".

Estou assumindo que você não se importa muito com o espaço em disco - uma máscara de bits é eficiente do ponto de vista do espaço, mas não tenho certeza se isso importa muito se você estiver usando o SQL Server.

Estou assumindo que você se preocupa com a velocidade. Uma máscara de bits pode ser muito rápida ao usar cálculos - mas você não poderá usar um índice ao consultar a máscara de bits. Isso não deve importar muito, mas se você quiser saber quais usuários têm acesso de criação, sua consulta seria algo como
select * from user where permsission & CREATE = TRUE

(não tenho acesso ao SQL Server hoje, na estrada). Essa consulta não seria capaz de usar um índice por causa da operação matemática - portanto, se você tiver um grande número de usuários, isso seria bastante doloroso.

Estou assumindo que você se preocupa com a manutenção. Do ponto de vista da manutenção, a máscara de bits não é tão expressiva quanto o domínio do problema subjacente como armazenar permissões explícitas. Você quase certamente teria que sincronizar o valor dos sinalizadores de máscara de bits em vários componentes - incluindo o banco de dados. Não impossível, mas dor nas costas.

Portanto, a menos que haja outra maneira de avaliar "melhor", eu diria que a rota de máscara de bits não é tão boa quanto armazenar as permissões em uma estrutura de banco de dados normalizada. Eu não concordo que seria "mais lento porque você tem que fazer uma junção" - a menos que você tenha um banco de dados totalmente disfuncional, você não poderá medir isso (enquanto a consulta sem o benefício de um índice ativo pode se tornar visivelmente mais lento, mesmo com alguns milhares de registros).