sql >> Database teknologi >  >> RDS >> Sqlserver

Hvornår er det bedre at gemme flag som en bitmaske i stedet for at bruge en associativ tabel?

Fantastisk spørgsmål!

Lad os først gøre nogle antagelser om "bedre".

Jeg går ud fra, at du er ligeglad med diskplads - en bitmaske er effektiv fra et pladssynspunkt, men jeg er ikke sikker på, at det betyder meget, hvis du bruger SQL-server.

Jeg går ud fra, at du bekymrer dig om hastighed. En bitmaske kan være meget hurtig, når du bruger beregninger - men du vil ikke kunne bruge et indeks, når du forespørger på bitmasken. Dette burde ikke betyde så meget, men hvis du vil vide, hvilke brugere der har oprettelsesadgang, vil din forespørgsel være noget i retning af

select * from user where permsission & CREATE = TRUE

(har ikke fået adgang til SQL Server i dag, på farten). Den forespørgsel ville ikke være i stand til at bruge et indeks på grund af den matematiske operation - så hvis du har et stort antal brugere, ville det være ret smertefuldt.

Jeg går ud fra, at du interesserer dig for vedligeholdelse. Fra et vedligeholdelsessynspunkt er bitmasken ikke så udtryksfuld som det underliggende problemdomæne som lagring af eksplicitte tilladelser. Du ville næsten helt sikkert skulle synkronisere værdien af ​​bitmask-flag på tværs af flere komponenter - inklusive databasen. Ikke umuligt, men smerter i ryggen.

Så medmindre der er en anden måde at vurdere "bedre", vil jeg sige, at bitmask-ruten ikke er så god som at gemme tilladelserne i en normaliseret databasestruktur. Jeg er ikke enig i, at det ville være "langsommere, fordi du er nødt til at deltage" - medmindre du har en totalt dysfunktionel database, vil du ikke være i stand til at måle dette (hvorimod forespørgsler uden fordelen af ​​et aktivt indeks kan blive mærkbart langsommere med selv et par tusinde poster).



  1. Sådan undgår du MySQL 'Deadlock fundet, når du forsøger at få lås; prøv at genstarte transaktion'

  2. Din ultimative guide til SQL Join:INNER JOIN – Del 1

  3. hvordan adskilles strengen i forskellige kolonner?

  4. mysql forberedt sætning fejl:MySQLSyntaxErrorException