Jeszcze raz o kluczach naturalnych

Tym razem w kontekście wydajności. Jednym z zarzutów podnoszonych przy okazji dyskusji o kluczach naturalnych opartych o typ tekstowy jest wydajność. Można by się spierać czy klucz sztuczny oparty o typ INT jest lepszym rozwiązaniem niż klucz oparty o typ VARCHAR/CHAR/TEXT. Takiego sporu jednoznacznie rozstrzygnąć nie można. Warto jednak przyjrzeć się argumentacji dotyczącej wydajności.

By porównać oba te rozwiązania należało by przeprowadzić testy. Na całe szczęście już ktoś takie testy przeprowadził. Tym kimś jest Depesz. W dzisiejszym wpisie poruszył problem identyfikatorów liczbowych i tekstowych.

Nie będę tu opisywać całego testu. Poczytajcie jego bloga. Ważniejsze są wyniki, a te mówią, że różnica pomiędzy identyfikatorem liczbowym (INT4) i tekstowym (TEXT) jeśli chodzi o czas wykonania pojedynczego zapytania typu SELECT * FROM tabela WHERE id = ? wynosi…

2,7% na korzyść typu liczbowego w przypadku identyfikatorów o ośmiu znakach.
4,8% na korzyść typu liczbowego w przypadku identyfikatorów o dwudziestu dwóch znakach.

Jak widać różnice są niewielkie i w przypadku typowych aplikacji biznesowych można je pominąć.

2 myśli na temat “Jeszcze raz o kluczach naturalnych

  1. Ja również jestem zwolennikiem stosowania kluczy naturalnych, ale przy tym też trzeba mieć pewien rozsądek. Szczególnie jeśli mamy do czynienia z kluczem naturalnym złożonym, wtedy czasem lepiej wprowadzić prosty klucz główny sztuczny. Zdarzało mi się widywać na siłę wprowadzane złożone klucze naturalne, które ciągnęły się przez kilka relacji tabel i na końcu wychodził niezły potworek.

  2. Klucz naturalny, który jest do tego jeszcze kluczem złożonym to dobre rozwiązanie, ale nie wszystkie bazy danych poradzą sobie z tym problemem. Kluczem (nomen omen) do prawidłowego wprowadzenia takiego rozwiązanie może okazać się własny typ w bazie danych. Zarówno Postgres jak i Oracle dają możliwość tworzenia własnych typów.

Napisz odpowiedź

Twój adres e-mail nie zostanie opublikowany.

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax