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
, closed
albo inherit
zamiast 1
, 2
albo 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 tinyint
zuż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?
źródło
char
s? Jak mało wydajna!” jest przestarzały w porównaniu do 2015 r.Odpowiedzi:
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ą.
źródło
Tak, przechowywanie takich rzeczy jak
yes
lubtrue
zajmie 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 (yes
vsy
).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
enum
typ ( 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ż przechowywanie1
,2
lub3
jako 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
,2
lub3
) i wartościpublished
,closed
iinherit
są 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