Nie chcę tu wywoływać wojny religijnej, ale wydaje się, że istnieją dwie szkoły myślenia o tym, jak przedstawiać wartości logiczne w bazie danych. Niektórzy twierdzą, że bit
jest to odpowiedni typ danych, podczas gdy inni twierdzą, że tinyint
jest lepszy.
Jedyne różnice, o których wiem, to:
bit
: rozmiar pamięci to 1 bit, możliwe wartości to 0 lub 1tinyint
: rozmiar pamięci to 1 bajt, możliwe wartości to 0-255
Który typ danych jest lepszy, gdy chcesz przedstawić wartości logiczne? Czy tinyint
warte są dodatkowego narzutu „na wszelki wypadek”, którego potrzebujesz do wartości> 1?
sql
mysql
sql-server
types
Seibar
źródło
źródło
Odpowiedzi:
Kiedy dodasz bitową kolumnę do swojej tabeli, zajmie ona cały bajt w każdym rekordzie, a nie tylko pojedynczy bit. Po dodaniu drugiej kolumny bitowej zostanie ona zapisana w tym samym bajcie. Dziewiąta kolumna bitowa będzie wymagać drugiego bajtu pamięci. Tabele z kolumną 1-bitową nie będą miały żadnej korzyści z przechowywania.
Tinyint i wędzidło mogą działać zarówno z powodzeniem, jak i bez silnych preferencji.
źródło
BIT(n)
zamiastn
pól. Lub możesz użyć zwykłegoINT
i przechowywać każdą wartość logiczną jako kawałek. Ale jeśli masz zamiar z oddzielnymi polami, myślę, żeTINYINT
jest zwykle preferowane doBIT
MySQL.Bit ... chyba że należysz do klanu "prawda / fałsz / nie znaleziono pliku"
Na wypadek, gdybyś nie otrzymał referencji ...
A w przypadku Linq2SQL bit działa z prawdą / fałszem, co ułatwia programowanie. Obie mają zalety.
Należy również wziąć pod uwagę konserwację oprogramowania. Co się stanie, jeśli Ty (lub młodszy programista-stażysta) używasz 2, 3, 25, 41, 167, 200 itd.? Gdzie to jest udokumentowane? Bity same się dokumentują i są dość uniwersalne.
źródło
W razie potrzeby używam końcówek. Oprócz tego, że jest to poprawny semantycznie typ (liczba semantyki!), Wiele pól bitowych (do 8) w jednym wierszu (w każdym razie na serwerze SQL) można skonsolidować w jeden bajt pamięci. Po ósmej potrzebny jest dodatkowy bajt dla następnych 8 i tak dalej.
Bibliografia:
źródło
Dla użytkowników MySql - dlaczego nie powinieneś używać kolumn BIT w MySQL
źródło
Poprzedni post dotyczący StackOverflow: Jaka jest różnica między BIT i TINYINT w MySQL?
Dodając nową kolumnę „BOOL”, MySQL w rzeczywistości używa TINYINT.
Po prostu trzymałbym się BOOL (aka TINYINT ) i kontynuowałbym życie.
źródło
Boolean z definicji dopuszcza tylko dwie wartości. Dlaczego potrzebujesz do tego czegoś więcej niż jednego kawałka? jeśli potrzebujesz logiki z trzema (lub więcej) stanami, użyj większego typu danych, ale trzymałbym się (i robię) z polami bitowymi dla standardowej logiki boolowskiej.
źródło
Używam bitu, ponieważ oszczędza mi to konieczności używania ograniczenia sprawdzającego i ponieważ mój ORM automatycznie konwertuje bit na wartość logiczną dopuszczającą wartość zerową (C #), co bardzo doceniam po zakodowaniu.
źródło
Zero miejsca na fałsz
Cokolwiek wybierzesz, możesz ustawić
NULL
zamiast0
i nie zajmie to dodatkowego miejsca (ponieważ baza danych prawie zawsze maNULL
flagę dla każdego pola w każdym wierszu, po prostu tam siedzi; więcej informacji tutaj ). Jeśli również upewnisz się, że domyślną / najbardziej prawdopodobną wartością jestfalse
, zaoszczędzisz jeszcze więcej miejsca!Trochę miejsca na prawdę
Wartość do przedstawienia
true
wymaga przestrzeni zdefiniowanej przez typ pola; użycieBIT
pozwoli zaoszczędzić miejsce tylko wtedy, gdy tabela ma wiele takich kolumn, ponieważ wykorzystuje jeden bajt na 8 pól (w przeciwieństwie do tego,TINYINT
który wykorzystuje jeden bajt na pole).TINYINT
ma tę zaletę, że pozwala dostosować 8-wartościową maskę bitową bez martwienia się o zarządzanie kilkoma dodatkowymi kolumnami, a wyszukiwanie jest teoretycznie szybsze (pojedyncze pole liczb całkowitych w porównaniu z kilkoma polami bitowymi). Ale są pewne wady, takie jak wolniejsze porządkowanie, fantazyjne indeksowanie krzyżowe i brak nazw pól. Która dla mnie jest największą stratą; Twoja baza danych wymagałaby zewnętrznej dokumentacji, aby odnotować, które bity robią co w których maskach bitowych.W każdym razie unikaj pokusy używania
TEXT
pól do przechowywania wartości logicznych lub ich zbiorów. Przeszukiwanie tekstu wymaga dużo więcej pracy dla serwera, a dowolne schematy nazewnictwa, takie jak „włącz, wyłącz, wyłącz” mogą zaszkodzić interoperacyjności.źródło
Właśnie próbowałem grupować na bit (SQL Server 2k5) i działało dobrze. Lubię używać prawidłowego typu danych dla aplikacji. Jeśli jest to pole prawda / fałsz, używam bitu ...
źródło
Wszystkie te teoretyczne dyskusje są świetne, ale w rzeczywistości, przynajmniej jeśli używasz MySQL i naprawdę również dla SQLServer, najlepiej jest trzymać się danych niebinarnych dla swoich wartości logicznych z tego prostego powodu, że łatwiej jest z nimi pracować, gdy wyprowadzanie danych, wysyłanie zapytań i tak dalej. Jest to szczególnie ważne, jeśli próbujesz osiągnąć interoperacyjność między MySQL i SQLServer (tj. Synchronizujesz dane między nimi), ponieważ obsługa typu danych BIT jest różna w obu z nich. WIĘC w praktyce będziesz miał dużo mniej kłopotów, jeśli będziesz trzymać się numerycznego typu danych. Poleciłbym MySQL trzymać się z BOOL lub BOOLEAN, który jest przechowywany jako TINYINT (1). Nawet sposób, w jaki MySQL Workbench i MySQL Administrator wyświetlają typ danych BIT, nie jest przyjemny (to mały symbol danych binarnych).
źródło
Wydaje mi się, że nie widziałem tego wspomnianego powyżej, ale występuje problem braku możliwości agregowania kolumn BIT (np. MIN, MAX, a zwłaszcza SUM). Właśnie przetestowałem przy użyciu 2008 i problem nadal występuje. To jest największy powód, dla którego ostatnio używam tinyint - z drugiej strony lubię to, jak tinyint się skaluje - zawsze jest uciążliwe, gdy twoja flaga bitowa o wartości dwóch wartości nagle potrzebuje więcej możliwych wartości.
źródło
Wszystkie nasze tabele budujemy z polem „wektor” int. Następnie używamy tego pola jako zbioru 32 bitów, które możemy przypisać do dowolnego celu. (Potencjalnie przy użyciu grupy bitów dla zestawu stanów). Pozwala uniknąć konieczności ciągłego dodawania pól flag, jeśli zapomnimy.
źródło
@Kevin: Uważam, że można używać
group by
na polach bitowych (SQL Server 2005):declare @t table ( descr varchar(10), myBit1 bit, myBit2 bit ) insert into @t values ('test1', 0, 1) insert into @t values ('test2', 1, 0) insert into @t values ('test3', 1, 1) insert into @t values ('test4', 0, 0) select myBit1, count(myBit1) from @t group by myBit1 select myBit2, count(myBit1) from @t group by myBit2
Wyniki:
myBit1 ------ ----------- 0 2 1 2 myBit2 ------ ----------- 0 2 1 2
źródło
TinyInt to moje preferencje. Następnie, wykonując zagregowane liczenia względem pola, nie musisz go rzucać. Ponadto niektóre języki frontonu interpretują Bit inaczej niż inne, a użycie TinyInt sprawia, że sprawdzanie poprawności jest uniwersalne dla każdego języka interfejsu użytkownika.
źródło
Jeśli używasz MySQL, nie zaleca się używania typu danych BIT - http://www.xaprb.com/blog/2006/04/11/bit-values-in-mysql/
źródło
Lubię używać char (1) z „T” lub „F”. Tak, można go nadużywać z innymi wartościami, ale przynajmniej jest łatwy do przeglądania w raportach lub innych miejscach, w których trudniej jest pracować z wartościami bitowymi lub binarnymi.
źródło
-1
do przedstawiania prawdy i0
fałszu.