SQL (nie tylko mySQL) nie nadaje się do operacji bitowych. Jeśli zrobisz bitowe I wymusisz skanowanie tabeli, ponieważ SQL nie będzie mógł używać żadnego indeksu i będzie musiał sprawdzać każdy wiersz po jednym.
Byłoby lepiej, gdyby utworzono oddzielną tabelę "Kategorie" i odpowiednio zindeksowano wiele tablic PostingCategories do połączenia dwóch.
UPDATE
Dla ludzi, twierdząc, że pola bitmapy nie są problemem, warto sprawdzić Joe Celko na BIT of a Problem. W dolnej części artykułu znajduje się lista poważnych problemów spowodowanych przez mapy bitowe.
Odnośnie komentarza, że oświadczenie koc nie może być prawda, Nota nr 10 - rozkłada 1nF więc tak, pola rastrowe są złe:
- Dane są nieczytelne. ...
- Ograniczenia to b #### do napisania ....
- Ograniczasz się do dwóch wartości na pole. To bardzo restrykcyjne; nawet kod seksu ISO nie mieści się w takiej kolumnie ...
- Nie ma elementu tymczasowego do maski bitowej (lub do flag jednobitowych). Na przykład flaga "is_legal_adult_flg" ... DATA dla daty urodzenia (tylko 3 bajty) będzie zawierała kompletny fakt i obliczmy to, co musimy wiedzieć; zawsze też będzie to poprawne. ...
- Dowiesz się, że używanie flag będzie miało tendencję do dzielenia statusu jednostki na wiele tabel ...
- Flagi bitowe zachęcają do nadmiarowości. W systemie, który właśnie wspomniałem, mieliśmy "is_active_flg" i "is_completed_flg" w tej samej tabeli. Zakończona aukcja nie jest aktywna i jest wersetem. To jest ten sam fakt w dwóch flagach. Psychologia ludzka (i język angielski) woli słyszeć afirmatywne sformułowanie (pamiętajcie o starej pieśni "Tak, dziś nie mamy bananów!"?). Wszystkie te znaczniki bitów i sprawdzanie poprawności sekwencji są zastępowane przez dwa zestawy tabel przejść stanu, jeden dla licytacji i jeden dla wysyłek. Szczegółowe informacje na temat ograniczeń przejścia stanu. Historia każdej aukcji jest teraz w jednym miejscu i musi być zgodna z regułami biznesowymi.
- Zanim zdemontujesz kolumnę z bitową maską i wyrzucisz pola, których nie potrzebujesz, wydajność nie poprawi się w porównaniu z prostszymi typami danych.
- Grupowanie i zamawianie na poszczególnych polach to prawdziwy ból. Spróbuj.
- Musisz zindeksować całą kolumnę, więc jeśli nie powinieneś mieć szczęścia i mieć je we właściwej kolejności, utkniesz przy skanowaniu tabeli.
- Ponieważ maska bitowa nie znajduje się w pierwszej normalnej formie (1NF), masz wszystkie anomalie, których chcieliśmy uniknąć w RDBMS.
Dodałbym również, co z NULL-y? A co z brakującymi flagami? Co jeśli coś nie jest ani prawdziwe, ani fałszywe?
Wreszcie, w odniesieniu do żądania kompresji, większość baz danych spakowuje pola bitów do bajtów i intów wewnętrznie. Pole bitmapy nie oferuje w tym przypadku żadnego rodzaju kompresji. Inne bazy danych (np. PostgreSQL) mają faktycznie typ Boolean, który może być prawdziwy/fałszywy/nieznany. Może to zająć 1 bajt, ale to , a nie dużo miejsca i przejrzysta kompresja jest dostępna, jeśli tabela staje się zbyt duża.
W rzeczywistości, jeśli tabela staje się duża, pola bitmapowe stają się znacznie poważniejsze. Zapisanie kilku MB w tabeli GB nie przynosi korzyści, jeśli jesteś zmuszony do korzystania ze skanowania tabeli lub jeśli utracisz możliwość grupowania
Dlaczego nie tylko dodatkowa tabela pomiędzy: categories_postings? To byłoby bardziej przyszłościowe rozwiązanie, ponieważ wydaje się to zwykłą bazą danych wielu kategorii? –
Zgadzam się z Lucem, łatwiej będzie utrzymać dodatkową tabelę zwaną, powiedzmy, groups_groups, która będzie miała strukturę taką jak: id, category_group_name, health, marketing, personal, music ... i która będzie posiadać albo "0"/"1" w każdej kategorii, aby oznaczyć, czy ta kategoria należy do tej grupy. W ten sposób znacznie łatwiej będzie zsumować liczbę grup, które zawierają kategorię "zdrowie". – alfasin
@Luc - oboje macie rację - faktem jest, że dane są publikowane przez zewnętrzną aplikację, gdzie nie mogę wprowadzać żadnych zmian. Wiele relacji byłoby najlepszym rozwiązaniem ... – derRobert