Po co przechowywać flagi / wyliczenia w bazie danych jako ciągi zamiast liczb całkowitych?

29

Przeglądałem zrzuty SQL niektórych znanych CMSów, w tym Drupala 7, Wordpressa (niektóre bardzo stare wersje) i niektórych niestandardowych aplikacji opartych na Pythonie.

Wszystkie te zrzuty zawierały dane z flagami ciągów zamiast liczb całkowitych. Na przykład, status post został przedstawiony jako published, closedalbo inheritzamiast 1, 2albo 3.

Mam dość ograniczone doświadczenie w projektowaniu baz danych i nigdy nie omijałem prostych SQL-ów, ale zawsze uczono mnie, że powinienem używać flag numerycznych / całkowitych dla takich danych. Oczywiste jest, że tinyintzużywa znacznie mniej miejsca w bazie danych niż na przykład varchar(9).

Więc czego mi brakuje? Czy nie jest to strata pamięci i nadmiarowość danych? Czy przeglądanie, wyszukiwanie i indeksowanie nie byłoby trochę szybsze, gdyby w tych kolumnach zastosowano liczby całkowite zamiast ciągów?

trejder
źródło
7
Czy jesteś pewien, że tak naprawdę nie używają dev.mysql.com/doc/refman/5.0/en/enum.html, który będzie wyglądał jak ciąg znaków w zrzutu? Tak czy inaczej myślę, że w dzisiejszych czasach prawie liczy się to jako mikrooptymalizacja.
Esben Skov Pedersen
2
To pytanie jest zasadniczo odwołaniem do władzy.
DeadMG
3
Odpowiedź nie jest pełna, ale ... znasz język skryptowy Lua? Znany z bezpośredniej i wysokiej wydajności, używany do pisania całych silników gier itp.? Zaskakujące ... nigdy nie zadawali sobie trudu posiadania typu liczbowego. Ich kod obsługi ciągów jest tak skuteczny, że mogą dodawać razem liczby, które są właściwie ciągami, w kodzie silnika gry zależnym od czasu. Podobnie jak JavaScript, nie mają nawet obiektów - po prostu bardzo fantazyjne tabele skrótów. Widok programisty C na „ogromną tablicę chars? Jak mało wydajna!” jest przestarzały w porównaniu do 2015 r.
Katana314
2
Edytowane w celu usunięcia części „odwołanie się do autorytetu” i ponownie otwarte, ponieważ pytanie o używanie ciągów zamiast ints jest doskonale tematyczne, o ile nie dotyczy konkretnie tych „autorytetów”.
Ixrec

Odpowiedzi:

45

Tak, przechowywanie ciągów zamiast liczb może zajmować więcej miejsca. Powodem, dla którego tak czynią to wysokiej klasy platformy, jest to, że uważają, że korzyści tego rozwiązania są większe niż koszty.

Jakie są korzyści? Możesz łatwo odczytać zrzut bazy danych i zrozumieć, o co chodzi, bez zapamiętywania tabel enum, a nawet półoficjalne GUI mogą po prostu użyć samych wartości wartości zamiast przekształcić uzyskany rekord. (Jest to podstawowa forma wymiany miejsca na dysku / czasu przetwarzania.)

Co z kosztami? Pojemność pamięci masowej nie była od dawna wąskim gardłem w CMS, ponieważ dyski stały się tak duże i tak tanie. Z drugiej strony czas programisty zwykle staje się droższy - więc z punktu widzenia biznesu wszystko, co wymienia wysiłek rozwojowy dotyczący miejsca na dysku, jest również dobrą rzeczą.

Kilian Foth
źródło
7

Tak, przechowywanie takich rzeczy jak yeslub truezajmie więcej miejsca niż małe. Nie powinno to dziwić. Powoduje to również, że indeksowanie, a tym samym mniej wydajne połączenia dla bazy danych. Ma również karę za ewentualne zamieszanie w przypadku prawidłowej wartości ( yesvs y).

Istnieje jednak wiele podejść, które wyglądają podobnie do przechowywania ciągów w bazie danych (w szczególności MySQL), które są wydajne.

Po pierwsze, MySQL ma enumtyp ( docs ), który po skonfigurowaniu w ten sposób może bardzo przypominać logiczny lub ograniczony zestaw ciągów znaków. Wymusza również wprowadzanie tylko prawidłowych wartości. Jest to często o wiele bardziej przydatne niż przechowywanie 1, 2lub 3jako wartość jak rozumieniu jest przenoszony z informacjami. Wyliczenie zawiera karę, że zmiana schematu jest wymagana do dodawania lub usuwania typów.

To prowadzi nas do tabeli potomnej i kluczy obcych (dotyczy wszystkich baz danych). Tak, jesteś przechowywania pewną wartość jako klucz (z powrotem do 1, 2lub 3) i wartości published, closedi inheritsą przechowywane w innej tabeli. Za pomocą widoku ( dokumentów ) można wtedy wyglądać tak, jakby tabela zawierała ciąg zamiast klucza. Ma to tę zaletę, że żadna zmiana schematu nie jest wymagana do dodawania lub usuwania pozycji z tabeli potomnej.

Dokładny sposób przechowywania rzeczy wymagałby spojrzenia na rzeczywisty DDL schematu w celu ustalenia, która metoda jest używana i uzyskania pewnej wskazówki, które kompromisy wybrali.


źródło