Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Kiedy lepiej przechowywać flagi jako maskę bitową zamiast używać tabeli asocjacyjnej?

Wspaniałe pytanie!

Najpierw przyjmijmy pewne założenia dotyczące „lepszego”.

Zakładam, że nie zależy Ci zbytnio na przestrzeni dyskowej — maska ​​bitowa jest wydajna z punktu widzenia przestrzeni, ale nie jestem pewien, czy ma to duże znaczenie, jeśli używasz serwera SQL.

Zakładam, że zależy ci na szybkości. Maska bitowa może być bardzo szybka podczas korzystania z obliczeń - ale nie będziesz w stanie użyć indeksu podczas zapytań o maskę bitową. Nie powinno to mieć większego znaczenia, ale jeśli chcesz wiedzieć, którzy użytkownicy mają dostęp do tworzenia, Twoje zapytanie będzie wyglądało mniej więcej tak

select * from user where permsission & CREATE = TRUE

(nie mam dziś dostępu do SQL Server, w drodze). To zapytanie nie będzie mogło użyć indeksu ze względu na działanie matematyczne - więc jeśli masz ogromną liczbę użytkowników, byłoby to dość bolesne.

Zakładam, że zależy Ci na łatwości utrzymania. Z punktu widzenia łatwości konserwacji maska ​​bitowa nie jest tak wyrazista jak domena problemu, jak przechowywanie jawnych uprawnień. Prawie na pewno będziesz musiał zsynchronizować wartości flag masek bitowych w wielu komponentach - w tym w bazie danych. Nie niemożliwe, ale ból w plecach.

Tak więc, chyba że istnieje inny sposób oceny „lepszej”, powiedziałbym, że trasa maski bitowej nie jest tak dobra, jak przechowywanie uprawnień w znormalizowanej strukturze bazy danych. Nie zgadzam się, że byłoby to „wolniejsze, ponieważ musisz wykonać dołączenie” - o ile nie masz całkowicie dysfunkcyjnej bazy danych, nie będziesz w stanie tego zmierzyć (podczas gdy zapytania bez korzyści z aktywnego indeksu mogą stać się zauważalnie wolniej przy nawet kilku tysiącach rekordów).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wskazówki dotyczące naprawiania fragmentacji indeksu SQL Server

  2. Czy SQL Server Express LocalDB może być połączony zdalnie?

  3. Jak naprawić „Nieprawidłowa nazwa obiektu „OPENJSON”. w SQL Server

  4. Dlaczego nie mogę użyć aliasu w instrukcji DELETE?

  5. Funkcja SQL Row_Number() w klauzuli Where