Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Quand est-il préférable de stocker les indicateurs sous forme de masque plutôt que d'utiliser une table associative ?

Excellente question !

Tout d'abord, faisons quelques hypothèses sur "mieux".

Je suppose que vous ne vous souciez pas beaucoup de l'espace disque - un masque de bits est efficace du point de vue de l'espace, mais je ne suis pas sûr que cela importe beaucoup si vous utilisez un serveur SQL.

Je suppose que vous vous souciez de la vitesse. Un masque de bits peut être très rapide lors de l'utilisation de calculs, mais vous ne pourrez pas utiliser d'index lors de l'interrogation du masque de bits. Cela ne devrait pas avoir beaucoup d'importance, mais si vous voulez savoir quels utilisateurs ont un accès en création, votre requête serait quelque chose comme

select * from user where permsission & CREATE = TRUE

(n'ont pas accès à SQL Server aujourd'hui, sur la route). Cette requête ne pourrait pas utiliser un index à cause de l'opération mathématique - donc si vous avez un grand nombre d'utilisateurs, ce serait assez pénible.

Je suppose que vous vous souciez de la maintenabilité. Du point de vue de la maintenabilité, le masque de bits n'est pas aussi expressif que le domaine problématique sous-jacent en tant que stockage d'autorisations explicites. Vous devrez presque certainement synchroniser la valeur des indicateurs de masque de bits sur plusieurs composants, y compris la base de données. Pas impossible, mais douleur dans le dos.

Donc, à moins qu'il n'y ait un autre moyen d'évaluer "mieux", je dirais que la route du masque de bits n'est pas aussi bonne que le stockage des autorisations dans une structure de base de données normalisée. Je ne suis pas d'accord pour dire que ce serait "plus lent parce que vous devez faire une jointure" - à moins que vous n'ayez une base de données totalement dysfonctionnelle, vous ne pourrez pas mesurer cela (alors qu'interroger sans le bénéfice d'un index actif peut devenir sensiblement plus lent avec même quelques milliers d'enregistrements).