bit string
Ostatnio uczyłem się o typie danych i jestem bardzo ciekawy:
Na dole tej strony z dokumentami znajduje się zdanie:
... plus 5 lub 8 bajtów narzutu w zależności od długości łańcucha
W jaki sposób obsługiwane są ciągi bitów w innych językach, takich jak PHP, Java, C #, C ++ itp., Poprzez sterowniki takie jak Npgsql, ODBC itp.
W przypadku pytania nr 1 użycie smallinta lub biginta będzie znacznie bardziej wydajnym miejscem do przechowywania i być może zapewni wzrost wydajności, ponieważ liczby całkowite są obsługiwane wszędzie. Większość języków programowania z łatwością obsługuje operacje bitowe na liczbach całkowitych. Jeśli tak, to po co wprowadzać typ danych łańcuchów bitowych? Czy dotyczy to tylko przypadków wymagających dużej ilości masek bitowych? Może indeksowanie pól bitowych? Jestem ciekaw, jak indeksowanie pól bitowych odbywa się w PostgreSQL.
Jeśli chodzi o # 2, jestem zmieszany, bardziej niż ciekawy. Na przykład, co jeśli przechowuję maski bitów dnia tygodnia w polu bit (7), jeden bit na dzień, a najniższy bit reprezentuje poniedziałek. Następnie pytam o wartość w PHP i C ++. Co dostane? Dokumentacja mówi, że będę miał trochę łańcucha, jednak nie jest to coś, czego mogę użyć bezpośrednio - jak w przypadku liczb całkowitych. Czy w takim przypadku powinienem zrezygnować z bitów?
Czy ktoś może wyjaśnić, dlaczego i kiedy powinienem używać bitów lub bitów?
źródło
Odpowiedzi:
Jeśli masz tylko kilka zmiennych, rozważę zachowanie oddzielnych
boolean
kolumn.NULL
wartości dla poszczególnych bitów, jeśli są potrzebne. Zawsze możesz zdefiniować kolumny,NOT NULL
jeśli tego nie zrobisz.Optymalizacja pamięci
Jeśli masz więcej niż pełne zmienne pełne ręki, ale mniej niż 33, an
integer
kolumna może ci najlepiej służyć. (Lub abigint
dla maksymalnie 64 zmiennych.)=
operator).bit string
lubboolean
.Przy jeszcze większej liczbie zmiennych lub jeśli chcesz często manipulować wartościami, lub jeśli nie masz ogromnych tabel, a miejsce na dysku / pamięci RAM nie stanowi problemu, lub jeśli nie jesteś pewien, co wybrać, rozważę
bit(n)
lubbit varying(n)
.Przykłady
W przypadku zaledwie 3 bitów informacji poszczególne
boolean
kolumny zawierają 3 bajty,integer
potrzeba 4 bajtów i abit string
6 bajtów (5 + 1).Dla 32 bitów informacji
integer
nadal potrzebuje 4 bajtów,bit string
zajmuje 9 bajtów dla tego samego (5 + 4) iboolean
kolumny zajmują 32 bajty.Dalsza lektura
źródło
Wszystkie typy PostgreSQL są przydatne do niektórych rzeczy, a mniej przydatne do innych. Ogólnie rzecz biorąc, bardziej martwisz się o funkcjonalność, a później o wydajność. PostgreSQL ma wiele funkcji do manipulowania różnego rodzaju typami danych i nie stanowią one wyjątku.
Oczekiwałbym, że w warstwie aplikacji, chyba że sterownik db poradzi sobie z jakąś konwersją typu, otrzymasz reprezentację ciągu i będziesz musiał to obsłużyć. Dlatego może, ale nie musi być przydatny w tej roli.
Przydatne jest, gdy chcesz wybrać rekordy na podstawie operacji bitowych, takich jak bitowa lub bitowa, lub w inny sposób manipulować danymi w zapytaniach SQL. O ile nie robisz tego, wiele bardziej ezoterycznych funkcji PostgreSQL jest mniej pomocnych.
Należy również pamiętać, że w przypadku dłuższych ciągów informacji binarnych istnieje interfejs dużych obiektów, który pozwala na przesyłanie strumieniowe itp. Oraz interfejs bytea, który umożliwia bardziej zwięzłą reprezentację ciągu.
tl; dr: Jeśli będziesz go potrzebować, będziesz o tym wiedział. W przeciwnym razie zapisz go w sekcji „zarezerwowane do przyszłego użytku”.
źródło