sql >> Databasteknik >  >> RDS >> Sqlserver

När är det bättre att lagra flaggor som en bitmask istället för att använda en associativ tabell?

Fantastisk fråga!

Låt oss först göra några antaganden om "bättre".

Jag antar att du inte bryr dig så mycket om diskutrymme - en bitmask är effektiv ur utrymmessynpunkt, men jag är inte säker på att det spelar någon roll om du använder SQL-server.

Jag antar att du bryr dig om hastighet. En bitmask kan vara mycket snabb när du använder beräkningar - men du kommer inte att kunna använda ett index när du frågar efter bitmasken. Detta borde inte spela så stor roll, men om du vill veta vilka användare som har skapat åtkomst, skulle din fråga vara ungefär som

select * from user where permsission & CREATE = TRUE

(har inte tillgång till SQL Server idag, på resande fot). Den frågan skulle inte kunna använda ett index på grund av den matematiska operationen - så om du har ett stort antal användare skulle det vara ganska smärtsamt.

Jag antar att du bryr dig om underhåll. Ur underhållssynpunkt är bitmasken inte lika uttrycksfull som den underliggande problemdomänen som att lagra explicita behörigheter. Du måste nästan säkert synkronisera värdet på bitmaskflaggorna över flera komponenter - inklusive databasen. Inte omöjligt, men ont i ryggen.

Så om det inte finns ett annat sätt att bedöma "bättre", skulle jag säga att bitmaskvägen inte är lika bra som att lagra behörigheterna i en normaliserad databasstruktur. Jag håller inte med om att det skulle vara "långsammare eftersom du måste göra en join" - om du inte har en helt dysfunktionell databas kommer du inte att kunna mäta detta (medan det kan bli märkbart att fråga utan nytta av ett aktivt index långsammare med till och med några tusen skivor).



  1. Så här ändrar du lagringsperiod för ändring av datainsamling (CDC) i SQL Server - självstudiekurs för SQL Server

  2. Hur konfigurerar man UTF8-teckenuppsättning i Oracle?

  3. Denormalisering:När, varför och hur

  4. Hur LOCATE() fungerar i MariaDB