sql >> Database >  >> RDS >> Sqlserver

Wanneer is het beter om vlaggen als bitmasker op te slaan in plaats van een associatieve tabel te gebruiken?

Schitterende vraag!

Laten we eerst wat aannames doen over "beter".

Ik neem aan dat je niet veel om schijfruimte geeft - een bitmasker is efficiënt vanuit het oogpunt van ruimte, maar ik weet niet zeker of dat veel uitmaakt als je een SQL-server gebruikt.

Ik neem aan dat je om snelheid geeft. Een bitmasker kan erg snel zijn bij het gebruik van berekeningen, maar u kunt geen index gebruiken bij het opvragen van het bitmasker. Dit zou niet zoveel moeten uitmaken, maar als je wilt weten welke gebruikers aanmaakrechten hebben, zou je vraag zoiets zijn als

select * from user where permsission & CREATE = TRUE

(heb vandaag geen toegang tot SQL Server, onderweg). Die zoekopdracht zou geen index kunnen gebruiken vanwege de wiskundige bewerking - dus als je een groot aantal gebruikers hebt, zou dit behoorlijk pijnlijk zijn.

Ik neem aan dat je om onderhoudbaarheid geeft. Vanuit het oogpunt van onderhoudbaarheid is het bitmasker niet zo expressief als het onderliggende probleemdomein als het opslaan van expliciete machtigingen. U zou vrijwel zeker de waarde van de bitmaskervlaggen over meerdere componenten moeten synchroniseren, inclusief de database. Niet onmogelijk, maar pijn in de rug.

Dus, tenzij er een andere manier is om "beter" te beoordelen, zou ik zeggen dat de bitmaskerroute niet zo goed is als het opslaan van de machtigingen in een genormaliseerde databasestructuur. Ik ben het er niet mee eens dat het "langzamer zou zijn omdat je een join moet doen" - tenzij je een volledig disfunctionele database hebt, kun je dit niet meten (terwijl query's zonder het voordeel van een actieve index merkbaar kunnen worden langzamer met zelfs een paar duizend records).



  1. De rollen gebruiken die zijn veranderd in MySQL 8.0

  2. Oracle - Een alleen-lezen gebruiker maken

  3. Hoe Atan2d() werkt in PostgreSQL

  4. SQL Server - transacties worden teruggedraaid bij fout?