2012-02-23 9 views
8

Rozumiem, że 2, 4, 8, 16, 32, 64, 128, 256 ... są dziesiętnymi odpowiednikami cyfr binarnych.Dlaczego schematy bazy danych często zawierają 32, 64, 128 itd.

Czy istnieje powód, dla którego są one używane w bazach danych? Na przykład pola VARCHAR mają często 255 znaków. Ponieważ (zakładam) każdy znak jest jeden bajt, dlaczego istnieje różnica między używaniem 255 znaków i używaniem 257 znaków?

Odpowiedz

4

Z varchar kolumn, długośćsą przechowywane z dane za pomocą liczb całkowitych w wiodących bajtów danych. Używana jest najmniejsza liczba bajtów; jeden bajt może przechowywać długości od 0 do 255, dwa bajty od 0 do 65535 itd. Przez wprowadzenie długości 255 otrzymamy "największą wartość" spośród minimalnego bajtu długości.

W minionych dniach warto było zapisać jeden bajt dysku zapisanego w wierszu. Mimo że dysk jest teraz tani, myślenie pozostało, szczególnie przez siwowłosy DBA.

Nie ma żadnej przewagi w wyborze długości, która jest potęgą 2, na przykład varchar(64) - jest to tylko nawyk/konwencja (ja nawet podążam za nią - i nie wiem dlaczego!).

+0

Ouch. Mam siwe włosy, ale nie jestem taki stary (38). :-) –

+0

Hmm, choć w dużych tabelach, gdzie trzeba wykonywać połączenia SELECT wymagające dużej liczby operacji wejścia/wyjścia, zapisanie kilku bajtów rozmiaru wiersza * może * wprowadzić różnicę. (Ale masz absolutną rację co do długości VARCHAR :) – osman

+1

@osman yes - im więcej wpisów w wierszach i/lub indeksach, które można zmieścić na 1 stronie dysku, tym lepsza wydajność. – Bohemian

1

Nie tylko schematy bazy danych, ale prawie każdy artefakt programistyczny będzie zawierał wiele liczb w postaci 2^N lub 2^N-1. Podczas gdy niektóre z tych zastosowań mają sens (na przykład 2^32-1 jest największą liczbą reprezentowaną jako standardowa liczba całkowita bez znaku w wielu architekturach maszyn), większość zastosowań mocy 2 jest mniej potrzebna. W praktyce, dawni hakerzy postrzegają moce 2 jako święte i oddają im cześć.

+0

Jak inaczej sprawy układają się ładnie podczas przeglądania zrzutów heksadecymalnych danych? ;-) – mpontillo

1

Dane w bazach danych są często uporządkowane w pages. Te strony są prawie uniwersalnie dostosowane do granic pamięci dla zarządzania pamięcią i pamięcią podręczną. Wybór wielkości 2^n dla danych jest dobry, aby zoptymalizować wykorzystanie przestrzeni w bazie danych.

Uwaga: W zależności od silnika RDBMS, 256 może nie być najlepszym wyborem dla zmiennej długości ciągów z pamięci wyrównującej perspektywy, ponieważ długość łańcucha zajmuje przestrzeń, jak również, to znaczy varchar(256) zajmuje 258 bajtów.

+0

O ile rozmiary danych nie są ustalone (char/nchar), nie ma to znaczenia dla kolumn o zmiennej długości, które są o wiele bardziej prawdopodobne, aby zostać zdefiniowane za pomocą tych magicznych liczb, i które rzadko są całkowicie wypełnione, a zatem nie równomiernie wypełniaj stronę w miłych małych klockach. –

+0

@AaronBertrand To jest punkt, który próbowałem wprowadzić w notatce na końcu odpowiedzi: 2^n liczb dla 'varchar' kolumn raczej nie pomoże w wyrównaniu strony. – dasblinkenlight

+0

Przepraszam, zacząłem mój komentarz po zakończeniu pierwszego akapitu. Zasugeruj powiedzenie czegoś o "ustalonych danych" zamiast "danych" na wypadek, gdy inne osoby również nie czytają twojej notatki. :-) –

1

To więcej przyzwyczajenia niż cokolwiek innego. Nie ma nic magicznego w varchar (32) lub varchar (64), podobnie nie ma nic magicznego w domyślnych narzędziach wizualnych, które próbują cię użyć zamiast tego (np. Varchar (50)). Wiele z tych górnych granic zostało wmanipulowanych ludziom w głowy, ponieważ 640 tys. To wystarczająca pamięć dla każdego i naprawdę musieliśmy się martwić każdym pojedynczym bajtem.

W wielu przypadkach sprowadza się do wspólnej podstawy. W poprzednim systemie, w którym pracowałem, menedżerowie produktu nie mieli pojęcia, jakie są ich wymagania. Chcieli zapisać nazwę, ale nie wiedzieli, na czym naprawdę polegała domena nazwisk - ale jeden z nich stwierdził, że słyszeli o nazwisku> 50 znaków, więc wiedział, że musi to być więcej niż 32 i więcej niż 50. Wróciliśmy z 64, zgodził się, że to wystarczy, i to jest to, co jest tam dzisiaj AFAIK.

Choć nie mieliśmy powodów technicznych e-mail (varchar (320)), który w tym czasie średnia podyktowane jako 320 znaków, bo 64 znaków dla nazwy użytkownika/LocalPart, 255 znaków na nazwę domeny, a 1 znaków dla @. Większość innych decyzji była oparta na pierwszeństwie (np. Wszystkie kolejne nazwy były zgodne z modelem nvarchar (64), jak postanowiono powyżej), lub logika (np. Adresy URL nie muszą być nvarchar (max), ale w zależności od standardu i możliwości przeglądarki w czas, oni byli ja wierzę albo varchar (2048) albo varchar (4096) .W tym przypadku nie dlatego, że był potęgą 2, ale ponieważ czyjeś oprogramowanie lub standardy zbudowały swoje rzeczy, aby użyć mocy 2.

+0

+1, ponieważ (jak sądzę) zalecamy stosowanie standardów konsultacyjnych, np. dla nazwiska osoby prywatnej użyłbym "VARCHAR (35)", aby dopasować [rządowe standardy danych mojego kraju] (http://interim.cabinetoffice.gov.uk/govtalk/schemasstandards/e-gif/datastandards/person_information/person_name/ person_full_name.aspx), częściowo dlatego, że moje oprogramowanie może wchodzić w interakcje z rządowymi bazami danych, ale także dlatego, że ktoś wykonał analizę w celu ustalenia, że ​​35 znaków spoza Unicode jest rozsądnym ograniczeniem, więc nie muszę tego robić! – onedaywhen

+0

Tak, oczywiście, jeśli istnieją standardy danych dla danej branży, należy z nich korzystać. Ale Twoi klienci i menedżerowie produktu - którzy są również Twoimi klientami - często dyktują inaczej, a ich atut zwykle bije atut standardu (chyba że są głupi lub niedorzeczni). I sprawdzą, czy naprawdę pozwalasz na 64-znakowe nazwisko, zaufaj mi. :-) –

+0

Zastanawiam się, czy gdyby ktoś sugerował użycie 'NVARCHAR' zamiast' VARCHAR', byłbym uprawniony do wzięcia [liścika z książki Joe Celko] (http://books.google.co.uk/books ? id = a9jtyioHfp8C & pg = PA131 i gazowe = PA131 i dq = Celko + buddyjski i źródło = Bl OTS = Py_oNKC6_h i porządek = d9MRYEcVlI-Noi03XWLaDhAv6WM & hl = pl & sa = X & ei = D0VGT6SzAYbN0QXa7KmmDg & at = 0CCAQ6AEwAA # v = onepage i q f = fałsz) i wprowadzenie chińskiego unikodowymi tam? ;) – onedaywhen

Powiązane problemy