Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00261 005959 14496787 na godz. na dobę w sumie
Antywzorce języka SQL. Jak unikać pułapek podczas programowania baz danych - książka
Antywzorce języka SQL. Jak unikać pułapek podczas programowania baz danych - książka
Autor: Liczba stron: 400
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-3482-8 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> bazy danych >> sql - programowanie
Porównaj ceny (książka, ebook, audiobook).

Zobacz, jak tego nie robić!

Podobno najlepiej jest uczyć się na cudzych błędach. Ta mądrość sprawdza się w wielu dziedzinach życia, także w informatyce. Ile razy brnąłeś w złe rozwiązanie, aż ktoś powiedział: 'tak się nie robi'? Czy nie pomyślałeś wtedy o książce, w której zamiast metod rozwiązywania danych problemów znalazłbyś informacje, jak do nich nie dopuścić? Chciałbyś, żeby ta książka dotyczyła języka SQL? Oto ona!

Niniejsza publikacja przedstawia zbiór antywzorców w języku SQL. Dzięki niej poznasz błędy najczęściej popełniane przy projektowaniu i wykorzystywaniu baz danych. Dowiesz się z niej, jak nie tworzyć logicznego i fizycznego projektu bazy danych, jak nie zadawać zapytań SQL oraz jak nie wytwarzać aplikacji - a wszystko po to, aby zrozumieć, jak nie popełniać błędów. W każdej z czterech części znajdziesz ogrom interesujących informacji: poznasz zasady przechowywania haseł, błędy pojawiające się w wyniku zaokrągleń czy sposoby radzenia sobie z brakiem integralności bazy danych. Książka ta jest genialną pozycją, dzięki której już nigdy nie zboczysz z drogi w codziennej pracy z bazami danych i językiem SQL!

Ucz się na błędach... Cudzych!


Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: SQL Antipatterns: Avoiding the Pitfalls of Database Programming Tłumaczenie: Mikołaj Szczepaniak ISBN: 978-83-246-3482-8 Copyright © 2011 The Pragmatic Programmers, LLC All rights reserved Copyright © 2012 by Helion S.A. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniej¬szej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficz¬ną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/antysq.zip Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/antysq Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis treĂci Rozdziaï 1. Wprowadzenie ................................................................. 11 1.1. Dla kogo jest ta ksiÈĝka ............................................................................. 13 1.2. Co znajduje siÚ w tej ksiÈĝce ...................................................................... 14 1.3. Czego nie ma w tej ksiÈĝce ........................................................................ 16 1.4. Konwencje ............................................................................................... 18 1.5. Przykïadowa baza danych ......................................................................... 19 1.6. PodziÚkowania ......................................................................................... 22 CzÚĂÊ I. Antywzorce logicznego projektu bazy danych ....... 23 Rozdziaï 2. Przechodzenie na czerwonym Ăwietle ......................... 25 2.1. Cel: przechowywanie atrybutów wielowartoĂciowych ................................... 26 2.2. Antywzorzec: listy elementów oddzielonych przecinkami ............................. 27 2.3. Jak rozpoznaÊ ten antywzorzec .................................................................. 31 2.4. Usprawiedliwione uĝycia tego antywzorca .................................................. 31 2.5. RozwiÈzanie: utworzenie tabeli ïÈczÈcej ..................................................... 32 Rozdziaï 3. Naiwne drzewa ............................................................... 37 3.1. Cel: przechowywanie i uzyskiwanie hierarchii ............................................. 38 3.2. Antywzorzec: zawsze odwoïuj siÚ do rodzica .............................................. 39 3.3. Jak rozpoznaÊ ten antywzorzec .................................................................. 43 3.4. Usprawiedliwione uĝycia tego antywzorca .................................................. 44 3.5. RozwiÈzanie: naleĝy uĝyÊ alternatywnych modeli drzew .............................. 46 6  Antywzorce jÚzyka SQL Rozdziaï 4. Identyfikator potrzebny od zaraz ................................. 61 4.1. Cel: wypracowanie konwencji dla kluczy gïównych ..................................... 62 4.2. Antywzorzec: jeden rozmiar dla wszystkich ................................................ 64 4.3. Jak rozpoznaÊ ten antywzorzec .................................................................. 69 4.4. Usprawiedliwione uĝycia tego antywzorca .................................................. 70 4.5. RozwiÈzanie: klucz skrojony na miarÚ ..................................................... 70 Rozdziaï 5. Wpis bez klucza ............................................................... 75 5.1. Cel: uproszczenie architektury bazy danych ................................................ 76 5.2. Antywzorzec: rezygnacja z ograniczeñ ....................................................... 77 5.3. Jak rozpoznaÊ ten antywzorzec .................................................................. 80 5.4. Usprawiedliwione uĝycia tego antywzorca .................................................. 81 5.5. RozwiÈzanie: deklarowanie ograniczeñ ...................................................... 81 Rozdziaï 6. Encja-atrybut-wartoĂÊ .................................................... 85 6.1. Cel: obsïuga zmiennych atrybutów ............................................................. 86 6.2. Antywzorzec: zastosowanie uniwersalnej tabeli atrybutów ........................... 87 6.3. Jak rozpoznaÊ ten antywzorzec .................................................................. 93 6.4. Usprawiedliwione uĝycia tego antywzorca .................................................. 94 6.5. RozwiÈzanie: modelowanie podtypów ........................................................ 95 Rozdziaï 7. ZwiÈzki polimorficzne .................................................. 103 7.1. Cel: odwoïania do wielu rodziców ........................................................... 104 7.2. Antywzorzec: zastosowanie dwuzadaniowego klucza obcego ..................... 105 7.3. Jak rozpoznaÊ ten antywzorzec ................................................................ 109 7.4. Usprawiedliwione uĝycia tego antywzorca ................................................ 110 7.5. RozwiÈzanie: uproszczenie relacji ............................................................ 110 Rozdziaï 8. Atrybuty wielokolumnowe .......................................... 117 8.1. Cel: przechowywanie atrybutów wielowartoĂciowych ................................. 118 8.2. Antywzorzec: utworzenie wielu kolumn .................................................... 118 8.3. Jak rozpoznaÊ ten antywzorzec ................................................................ 122 8.4. Usprawiedliwione uĝycia tego antywzorca ................................................ 123 8.5. RozwiÈzanie: utworzenie tabeli zaleĝnej ................................................... 124 Spis treĂci  7 Rozdziaï 9. Tribble metadanych ..................................................... 127 9.1. Cel: zapewnienie skalowalnoĂci ............................................................... 128 9.2. Antywzorzec: klonowanie tabel lub kolumn .............................................. 129 9.3. Jak rozpoznaÊ ten antywzorzec ................................................................ 134 9.4. Usprawiedliwione uĝycia tego antywzorca ................................................ 135 9.5. RozwiÈzanie: partycjonowanie i normalizacja ........................................... 137 CzÚĂÊ II. Antywzorce fizycznego projektu bazy danych ... 141 Rozdziaï 10. BïÚdy zaokrÈgleñ ......................................................... 143 10.1. Cel: stosowanie liczb uïamkowych zamiast liczb caïkowitych .................... 144 10.2. Antywzorzec: stosowanie typu danych FLOAT .................................... 144 10.3. Jak rozpoznaÊ ten antywzorzec .............................................................. 149 10.4. Usprawiedliwione uĝycia tego antywzorca .............................................. 150 10.5. RozwiÈzanie: stosowanie typu danych NUMERIC ............................... 150 Rozdziaï 11. 31 smaków ................................................................... 153 11.1. Cel: ograniczenie zakresu danych kolumny do okreĂlonych wartoĂci ......... 154 11.2. Antywzorzec: okreĂlanie wartoĂci w definicji kolumny ............................. 155 11.3. Jak rozpoznaÊ ten antywzorzec .............................................................. 159 11.4. Usprawiedliwione uĝycia tego antywzorca .............................................. 160 11.5. RozwiÈzanie: okreĂlanie akceptowanych wartoĂci na poziomie danych ..... 160 Rozdziaï 12. Pliki-widma ................................................................. 165 12.1. Cel: przechowywanie obrazów i innych duĝych zasobów ......................... 166 12.2. Antywzorzec: przekonanie o koniecznoĂci stosowania plików ................... 167 12.3. Jak rozpoznaÊ ten antywzorzec .............................................................. 171 12.4. Usprawiedliwione uĝycia tego antywzorca .............................................. 172 12.5. RozwiÈzanie: stosowanie typów danych BLOB ..................................... 173 Rozdziaï 13. Strzelanie indeksami ................................................... 177 13.1. Cel: optymalizacja wydajnoĂci ............................................................... 178 13.2. Antywzorzec: stosowanie indeksów bez ĝadnego planu ........................... 179 13.3. Jak rozpoznaÊ ten antywzorzec .............................................................. 184 13.4. Usprawiedliwione uĝycia tego antywzorca .............................................. 184 13.5. RozwiÈzanie: zasada MENTOR dla indeksów ..................................... 185 8  Antywzorce jÚzyka SQL CzÚĂÊ III. Antywzorce zapytañ .............................................. 193 Rozdziaï 14. Strach przed nieznanym ............................................ 195 14.1. Cel: odróĝnianie brakujÈcych wartoĂci .................................................... 196 14.2. Antywzorzec: stosowanie NULL jako zwykïej wartoĂci (lub odwrotnie) .... 197 14.3. Jak rozpoznaÊ ten antywzorzec .............................................................. 201 14.4. Usprawiedliwione uĝycia tego antywzorca .............................................. 202 14.5. RozwiÈzanie: stosowanie NULL jako unikatowej wartoĂci ..................... 203 Rozdziaï 15. Niejasne grupy ............................................................ 209 15.1. Cel: uzyskiwanie wiersza z najwiÚkszÈ wartoĂciÈ w skali grupy ................. 210 15.2. Antywzorzec: odwoïania do niegrupowanych kolumn ............................. 211 15.3. Jak rozpoznaÊ ten antywzorzec .............................................................. 214 15.4. Usprawiedliwione uĝycia tego antywzorca .............................................. 215 15.5. RozwiÈzanie: jednoznaczne stosowanie kolumn ...................................... 216 Rozdziaï 16. Losowy wybór .............................................................. 223 16.1. Cel: uzyskiwanie przypadkowego wiersza ............................................... 224 16.2. Antywzorzec: losowe sortowanie danych ................................................ 225 16.3. Jak rozpoznaÊ ten antywzorzec .............................................................. 226 16.4. Usprawiedliwione uĝycia tego antywzorca .............................................. 227 16.5. RozwiÈzanie: brak ustalonej kolejnoĂci… ............................................... 228 Rozdziaï 17. Wyszukiwarka nÚdzarza ............................................ 233 17.1. Cel: peïne przeszukiwanie tekstu ........................................................... 234 17.2. Antywzorzec: predykaty dopasowywania wzorców .................................. 235 17.3. Jak rozpoznaÊ ten antywzorzec .............................................................. 236 17.4. Usprawiedliwione uĝycia tego antywzorca .............................................. 237 17.5. RozwiÈzanie: stosowanie narzÚdzi odpowiednio dobranych do realizowanych zadañ ........................................................ 237 Rozdziaï 18. Zapytanie-spaghetti ................................................... 251 18.1. Cel: ograniczenie liczby zapytañ SQL-a ............................................. 252 18.2. Antywzorzec: rozwiÈzanie zïoĝonego problemu w jednym kroku .............. 253 18.3. Jak rozpoznaÊ ten antywzorzec .............................................................. 256 18.4. Usprawiedliwione uĝycia tego antywzorca .............................................. 257 18.5. RozwiÈzanie: dziel i zwyciÚĝaj ............................................................... 257 Spis treĂci  9 Rozdziaï 19. Ukryte kolumny .......................................................... 263 19.1. Cel: ograniczyÊ iloĂÊ wpisywanego kodu ................................................. 264 19.2. Antywzorzec: skrót prowadzÈcy na manowce ......................................... 265 19.3. Jak rozpoznaÊ ten antywzorzec .............................................................. 267 19.4. Usprawiedliwione uĝycia tego antywzorca .............................................. 268 19.5. RozwiÈzanie: naleĝy wprost nazywaÊ kolumny ....................................... 269 CzÚĂÊ IV. Antywzorce wytwarzania aplikacji .................... 273 Rozdziaï 20. Czytelne hasïa ............................................................. 275 20.1. Cel: odzyskiwanie lub resetowanie haseï ................................................. 276 20.2. Antywzorzec: przechowywanie haseï w formie zwykïego tekstu ................ 276 20.3. Jak rozpoznaÊ ten antywzorzec .............................................................. 279 20.4. Usprawiedliwione uĝycia tego antywzorca .............................................. 280 20.5. RozwiÈzanie: przechowywanie zabezpieczonych kodów haseï .................. 281 Rozdziaï 21. Wstrzykiwanie SQL-a ................................................. 289 21.1. Cel: pisanie dynamicznych zapytañ jÚzyka SQL .................................... 290 21.2. Antywzorzec: wykonywanie niesprawdzonych danych wejĂciowych jako kodu .......................................................................... 291 21.3. Jak rozpoznaÊ ten antywzorzec .............................................................. 299 21.4. Usprawiedliwione uĝycia tego antywzorca .............................................. 300 21.5. RozwiÈzanie: nie ufaÊ nikomu ............................................................... 301 Rozdziaï 22. Obsesja czystoĂci pseudokluczy ................................ 309 22.1. Cel: sprzÈtanie danych .......................................................................... 310 22.2. Antywzorzec: wypeïnianie luk ............................................................... 311 22.3. Jak rozpoznaÊ ten antywzorzec .............................................................. 314 22.4. Usprawiedliwione uĝycia tego antywzorca .............................................. 314 22.5. RozwiÈzanie: zapomnieÊ o problemie ................................................. 315 Rozdziaï 23. Przymykanie oczu na zïo ............................................ 321 23.1. Cel: pisaÊ mniej kodu ........................................................................... 322 23.2. Antywzorzec: Ăcinanie zakrÚtów ............................................................ 323 23.3. Jak rozpoznaÊ ten antywzorzec .............................................................. 326 10  Antywzorce jÚzyka SQL 23.4. Usprawiedliwione uĝycia tego antywzorca .............................................. 327 23.5. RozwiÈzanie: elegancka obsïuga bïÚdów ................................................ 327 Rozdziaï 24. Immunitet dyplomatyczny ........................................ 331 24.1. Cel: stosowanie najlepszych praktyk ................................................... 332 24.2. Antywzorzec: kod SQL-a jako obywatel drugiej kategorii ....................... 333 24.3. Jak rozpoznaÊ ten antywzorzec .............................................................. 334 24.4. Usprawiedliwione uĝycia tego antywzorca .............................................. 335 24.5. RozwiÈzanie: ustanowienie moĝliwie szerokiej kultury jakoĂci .................. 336 Rozdziaï 25. Magiczna fasola ........................................................... 347 25.1. Cel: upraszczanie modeli w architekturze model-widok-komponent .......... 348 25.2. Antywzorzec: model jako rekord aktywny (Active Record) ..................... 350 25.3. Jak rozpoznaÊ ten antywzorzec .............................................................. 356 25.4. Usprawiedliwione uĝycia tego antywzorca .............................................. 357 25.5. RozwiÈzanie: model zawierajÈcy rekord aktywny .................................... 358 Dodatki ..................................................................................... 365 Dodatek A. Reguïy normalizacji ...................................................... 367 A.1. Co to oznacza, ĝe baza jest relacyjna? ..................................................... 368 A.2. Mity dotyczÈce normalizacji ................................................................... 371 A.3. Czym jest normalizacja? ......................................................................... 372 A.4. Zdrowy rozsÈdek .................................................................................. 383 Dodatek B. Bibliografia .................................................................... 385 Skorowidz ........................................................................................ 387 Rozdziaï 10. BïÚdy zaokrÈgleñ 10,0 razy 0,1 prawie nigdy nie jest równe 1,0. Brian Kernighan N asz szef prosi nas o wygenerowanie raportu podsumowujÈcego koszty pracy programistów wedïug projektów (koszt ma byÊ wyzna- czany na podstawie czasu poĂwiÚconego na usuwanie poszczegól- nych bïÚdów). Kaĝdy programista reprezentowany w tabeli Konta otrzy- muje innÈ stawkÚ godzinowÈ, zatem musimy nie tylko rejestrowaÊ liczby godzin potrzebnych do usuniÚcia poszczególnych bïÚdów (w tabeli Bledy), ale teĝ mnoĝyÊ te wartoĂci przez atrybut stawka_godzinowa zdefiniowany dla wyznaczonych programistów. Plik BïÚdy-zaokrÈgleñ/wprowadzenie/cost-per-bug.sql SELECT b.id_bledu, b.godziny * k.stawka_godzinowa AS koszt_bledu FROM Bledy AS b JOIN Konta AS k ON (b.przypisany_do = k.id_konta); Obsïuga tego zapytania wymaga utworzenia nowych kolumn w tabelach Bledy i Konta. Obie kolumny powinny obsïugiwaÊ wartoĂci uïamkowe, poniewaĝ musimy ĂledziÊ koszty moĝliwie precyzyjnie. Decydujemy siÚ wiÚc zdefiniowaÊ nowe kolumny jako FLOAT, poniewaĝ wïaĂnie ten typ danych obsïuguje wartoĂci uïamkowe. 144  Rozdziaï 10. • BïÚdy zaokrÈgleñ Plik BïÚdy-zaokrÈgleñ/wprowadzenie/float-columns.sql ALTER TABLE Bledy ADD COLUMN godziny FLOAT; ALTER TABLE Konta ADD COLUMN stawka_godzinowa FLOAT; Obie kolumny aktualizujemy na podstawie zapisów w dziennikach prac nad eliminowaniem bïÚdów i stawek godzinowych programistów. Testu- jemy jeszcze generowanie raportu i jesteĂmy gotowi do codziennego przy- gotowywania potrzebnych zestawieñ. NastÚpnego dnia do naszego gabinetu wchodzi szef z kopiÈ raportu o kosz- tach projektu. „Te liczby nie zgadzajÈ siÚ” — wycedziï przez zaciĂniÚte zÚby. „Dla porównania wykonaïem te obliczenia rÚcznie i okazaïo siÚ, ĝe Twój raport jest nieprecyzyjny — nieznacznie, róĝnice wynoszÈ kilka zïotych. Jak to wyjaĂnisz?”. JesteĂmy przeraĝeni. Co moĝe nie zgadzaÊ siÚ w tak prostych obliczeniach? 10.1. Cel: stosowanie liczb uïamkowych zamiast liczb caïkowitych Liczba caïkowita jest wyjÈtkowo przydatnym typem danych, ale umoĝliwia reprezentowanie tylko wartoĂci caïkowitoliczbowych, jak 1, 327 czy –19. Ten typ danych nie oferuje moĝliwoĂci reprezentowania wartoĂci uïamko- wych, na przykïad 2,5. JeĂli wiÚc potrzebujemy liczb gwarantujÈcych wiÚk- szÈ precyzjÚ niĝ liczby caïkowite, musimy zastosowaÊ inny typ danych. Na przykïad kwoty pieniÚĝne zwykle sÈ reprezentowane przez liczby z dwoma miejscami dziesiÚtnymi, na przykïad 19,95 zï. Naszym celem jest przechowywanie wartoĂci numerycznych niebÚdÈcych liczbami caïkowitymi i wykorzystywanie tych liczb w obliczeniach arytme- tycznych. Istnieje jeszcze jeden cel, który jednak jest na tyle oczywisty, ĝe rzadko siÚ o nim wprost mówi — wyniki naszych obliczeñ arytmetycznych muszÈ byÊ prawidïowe. 10.2. Antywzorzec: stosowanie typu danych FLOAT WiÚkszoĂÊ jÚzyków programowania obsïuguje typy danych dla liczb caï- kowitych (zwykle pod nazwÈ float lub double). JÚzyk SQL obsïuguje podob- ny typ danych nazwany FLOAT. Wielu programistów odruchowo uĝywa typu 10.2. Antywzorzec: stosowanie typu danych FLOAT  145 danych FLOAT SQL-a wszÚdzie tam, gdzie potrzebujÈ uïamkowych danych liczbowych, poniewaĝ sÈ przyzwyczajeni do programowania z wykorzysta- niem tego typu danych. Typ danych FLOAT jÚzyka SQL, tak jak typ danych float w wiÚkszoĂci jÚzyków programowania, koduje liczby rzeczywiste w formacie binarnym zgodnie ze standardem IEEE 754. Efektywne uĝywanie tego typu wyma- ga zrozumienia wybranych cech liczb zmiennoprzecinkowych reprezento- wanych w tym formacie. ZaokrÈglanie z koniecznoĂci Wielu programistów nie zdaje sobie sprawy z istnienia pewnej waĝnej cechy tego formatu liczb zmiennoprzecinkowych: nie wszystkie wartoĂci, które moĝemy zapisywaÊ w formie liczb dziesiÚtnych, mogÈ byÊ reprezentowane w formie binarnej. W tej sytuacji niektóre wartoĂci wymagajÈ zaokrÈglania do bardzo zbliĝonych wartoĂci. Aby lepiej zrozumieÊ kontekst tych zaokrÈgleñ, wystarczy przeanalizowaÊ przypadek prostej liczby wymiernej, na przykïad jednej trzeciej, która jest reprezentowana przez okresowy uïamek dziesiÚtny 0,333… Prawdziwej wartoĂci nie moĝna reprezentowaÊ w formie dziesiÚtnej, poniewaĝ musieli- byĂmy zapisaÊ nieskoñczonÈ liczbÚ cyfr. Liczba cyfr po przecinku to tzw. precyzja reprezentacji odpowiedniej wartoĂci, zatem w peïni prawidïowa re- prezentacja uïamka okresowego wymagaïaby nieskoñczonej precyzji. RozwiÈzaniem kompromisowym jest stosowanie skoñczonej precyzji, tj. wybór wartoĂci liczbowej moĝliwie zbliĝonej do oryginalnej liczby uïamko- wej, na przykïad 0,333. WadÈ tego rozwiÈzania jest to, ĝe ta wartoĂÊ nie jest dokïadnie tÈ samÈ liczbÈ, którÈ chcemy reprezentowaÊ. 1/3+1/3+1/3 = 1,000 0,333+0,333+0,333 = 0,999 Nawet jeĂli zwiÚkszymy precyzjÚ, suma trzech przybliĝeñ jednej trzeciej wciÈĝ nie bÚdzie równa oczekiwanej wartoĂci 1,0. Kompromis polegajÈcy na stosowaniu skoñczonej precyzji dla uïamków okresowych jest jednak niezbÚdny. 1/3+1/3+1/3 = 1,000000 0,333333+0,333333+0,333333 = 0,999999 Oznacza to, ĝe niektóre prawidïowe wartoĂci liczbowe, które moĝemy sobie bez trudu wyobraziÊ, w ogóle nie mogÈ byÊ reprezentowane z zasto- sowaniem metody skoñczonej precyzji. CzÚĂÊ programistów uwaĝa, ĝe 146  Rozdziaï 10. • BïÚdy zaokrÈgleñ takie rozwiÈzanie jest usprawiedliwione — skoro wartoĂci zïoĝonych z nie- skoñczonej liczby cyfr i tak nie da siÚ zapisaÊ, kaĝda zapisywana przez nas liczba z natury rzeczy ma skoñczonÈ precyzjÚ i tak teĝ powinna byÊ prze- chowywana w formie binarnej, prawda? Niestety nie. Zgodnie ze standardem IEEE 754 liczby zmiennoprzecinkowe sÈ repre- zentowane w systemie liczbowym o podstawie 2. Oznacza to, ĝe wartoĂci wymagajÈce nieskoñczonej precyzji w systemie binarnym nie pokrywajÈ siÚ ze zbiorem wartoĂci, które wymagajÈ takiej reprezentacji w systemie dziesiÚt- nym. Niektóre wartoĂci, które wymagajÈ skoñczonej precyzji w systemie dziesiÚtnym, na przykïad 59,95, wymagajÈ nieskoñczonej precyzji, jeĂli miaïyby byÊ dokïadnie reprezentowane w systemie binarnym. Typ danych FLOAT nie oferuje takich moĝliwoĂci, zatem stosuje najbliĝszÈ obsïugiwanÈ wartoĂÊ w systemie liczbowym o podstawie 2, czyli wartoĂÊ odpowiadajÈcÈ liczbie 59.950000762939 w systemie dziesiÚtnym. Niektóre wartoĂci przypadkowo wymagajÈ skoñczonej precyzji w obu for- matach. JeĂli zrozumiemy szczegóïy przechowywania liczb w formacie IEEE 754, teoretycznie bÚdziemy potrafili przewidywaÊ, jak poszczególne wartoĂci dziesiÚtne bÚdÈ reprezentowane w formacie binarnym. W prakty- ce jednak wiÚkszoĂÊ programistów nie wykonuje podobnych obliczeñ dla kaĝdej stosowanej przez siebie liczby zmiennoprzecinkowej. Nie moĝemy zagwarantowaÊ, ĝe kolumna FLOAT w bazie danych bÚdzie dostatecznie precyzyjna, zatem nasza aplikacja powinna zakïadaÊ, ĝe kaĝda wartoĂÊ w tej kolumnie mogïa zostaÊ zaokrÈglona. Niektóre bazy danych obsïugujÈ pokrewne typy danych nazwane DOUBLE PRECISION i REAL. Precyzja oferowana przez te typy danych i sam typ FLOAT zaleĝy co prawda od implementacji bazy danych, ale wszystkie te typy reprezentujÈ wartoĂci zmiennoprzecinkowe ze skoñczonÈ liczbÈ cyfr binar- nych, zatem sposób zaokrÈglania liczb we wszystkich przypadkach jest podobny. Stosowanie typu FLOAT w jÚzyku SQL Niektóre bazy danych kompensujÈ wspomnianÈ niedokïadnoĂÊ i wyĂwie- tlajÈ wïaĂciwe wartoĂci. Plik BïÚdy-zaokrÈgleñ/anty/select-rate.sql SELECT stawka_godzinowa FROM Konta WHERE id_konta = 123; Zwraca: 59.95 10.2. Antywzorzec: stosowanie typu danych FLOAT  147 PoznaÊ format IEEE 754 Pierwsze propozycje dotyczÈce standardowego formatu binarnego dla liczb zmiennoprzecinkowych pojawiïy siÚ jeszcze w 1979 roku. Specyfikacja, która ostatecznie zyskaïa status standardu w 1985 roku, jest obecnie powszechnie implementowana w rozmaitych formach oprogramowania, przede wszystkim w jÚzykach programowania i mikroprocesorach. Format skïada siÚ z trzech pól niezbÚdnych do zakodowania wartoĂci zmiennoprzecinkowej: pola czÚĂci uïamkowej, pola wykïadnika, do którego naleĝy podnieĂÊ tÚ czÚĂÊ uïamkowÈ, oraz jednobitowego pola znaku. JednÈ z zalet standardu IEEE 754 jest wïaĂnie stosowanie wykïadnika, dziÚki czemu moĝna w tym formacie reprezentowaÊ zarówno bar- dzo maïe, jak i bardzo duĝe wartoĂci. Format obsïuguje nie tylko liczby rzeczywiste, ale teĝ duĝo wiÚkszy przedziaï wartoĂci niĝ tra- dycyjne, staïoprzecinkowe formaty reprezentacji liczb caïkowitych. Jeszcze wiÚkszy przedziaï reprezentowanych wartoĂci oferuje for- mat podwójnej precyzji. Oznacza to, ĝe opisywane formaty dobrze sprawdzajÈ siÚ w zastosowaniach naukowych. Bodaj najbardziej popularnym zastosowaniem uïamkowych warto- Ăci liczbowych jest reprezentowanie kwot pieniÚĝnych. Stosowanie standardu IEEE 754 dla tego rodzaju wartoĂci nie jest konieczne, poniewaĝ opisany w tym rozdziale format skalowanych liczb dzie- siÚtnych pozwala równie ïatwo i bardziej precyzyjnie obsïugiwaÊ kwoty pieniÚĝne. Dobrymi ěródïami wiedzy o tym formacie sÈ artykuï opublikowany na Wikipedii (http://pl.wikipedia.org/wiki/IEEE_754) oraz artykuï Davida Goldberga zatytuïowany „What Every Computer Scientist Should Know About Floating-Point Arithmetic” [Gol91]. Artykuï Goldberga zostaï teĝ przedrukowany (jest dostÚpny pod adresem http://www.validlab.com/goldberg/paper.pdf). Rzeczywista wartoĂÊ przechowywana w kolumnie typu FLOAT nie musi jednak odpowiadaÊ tej wartoĂci. Wystarczy pomnoĝyÊ tÚ wartoĂÊ przez miliard, aby odkryÊ pewne rozbieĝnoĂci: Plik BïÚdy-zaokrÈgleñ/anty/magnify-rate.sql SELECT stawka_godzinowa * 1000000000 FROM Konta WHERE id_konta = 123; Zwraca: 59950000762. 939 148  Rozdziaï 10. • BïÚdy zaokrÈgleñ Moĝna byïo oczekiwaÊ, ĝe wartoĂÊ zwrócona przez poprzednie zapytanie po przemnoĝeniu wyniesie 59950000000,000. Jak widaÊ, wartoĂÊ 59,95 zo- staïa zaokrÈglona do wartoĂci, która moĝe byÊ reprezentowana w systemie ze skoñczonÈ precyzjÈ oferowanym przez format binarny IEEE 754. W tym przypadku róĝnica jest mniejsza niĝ jedna milionowa, zatem jej dokïad- noĂÊ powinna wystarczyÊ na potrzeby wielu obliczeñ. Przybliĝenie nie gwarantuje jednak wystarczajÈcej dokïadnoĂci dla innych obliczeñ. Dobrym przykïadem jest uĝycie wartoĂci typu FLOAT w wyraĝeniu porównujÈcym liczby. Plik BïÚdy-zaokrÈgleñ/anty/inexact.sql SELECT * FROM Konta WHERE stawka_godzinowa = 59.95; Wynik: zbiór pusty, brak pasujÈcych wierszy Jak wiemy, wartoĂÊ przechowywana w kolumnie stawka_godzinowa w rze- czywistoĂci jest nieznacznie wiÚksza niĝ 59.95. W tej sytuacji, mimo ĝe przypisaliĂmy tej kolumnie wartoĂÊ 59.95 w wierszu z identyfikatorem konta 123, zapytanie nie jest dopasowywane do powyĝszego zapytania. Typowym obejĂciem tego problemu jest traktowanie wartoĂci zmienno- przecinkowych jako „praktycznie równe”, jeĂli dzielÈca je róĝnica nie przekracza jakiegoĂ niewielkiego progu. Wystarczy odjÈÊ jednÈ wartoĂÊ od drugiej i uĝyÊ dostÚpnej w jÚzyku SQL funkcji wartoĂci bezwzglÚdnej ABS(), aby uzyskana róĝnica byïa dodatnia. JeĂli wynik jest równy zero, obie wartoĂci sÈ dokïadnie równe. JeĂli wynik jest dostatecznie maïy, obie wartoĂci moĝna traktowaÊ jako praktycznie równe. Poniĝsze zapytanie prawidïowo odnajduje interesujÈcy nas wiersz: Plik BïÚdy-zaokrÈgleñ/anty/threshold.sql SELECT * FROM Konta WHERE ABS(stawka_godzinowa - 59.95) 0.000001; Róĝnica jest jednak na tyle duĝa, ĝe porównanie z nieco wiÚkszÈ precyzjÈ zakoñczy siÚ niepowodzeniem: Plik BïÚdy-zaokrÈgleñ/anty/threshold.sql SELECT * FROM Konta WHERE ABS(stawka_godzinowa - 59.95) 0.0000001; Dobór wïaĂciwego progu zaleĝy od konkretnej liczby, poniewaĝ wartoĂÊ bezwzglÚdna róĝnicy dzielÈcej wartoĂci dziesiÚtne od zaokrÈglonych repre- zentacji binarnych jest róĝna w przypadku poszczególnych liczb. 10.3. Jak rozpoznaÊ ten antywzorzec  149 Innym przykïadem problemu wynikajÈcego z nieprecyzyjnego charakteru typu FLOAT sÈ obliczenia polegajÈce na agregowaniu wielu wartoĂci. JeĂli na przykïad uĝyjemy funkcji SUM() do dodania wszystkich wartoĂci zmien- noprzecinkowych w jakiejĂ kolumnie, bïÚdy zaokrÈgleñ poszczególnych liczb skumulujÈ siÚ w wyznaczonej sumie. Plik BïÚdy-zaokrÈgleñ/anty/cumulative.sql SELECT SUM(b.godziny * k.stawka_godzinowa) AS koszty_projektu FROM Bledy AS b JOIN Konta AS k ON (b.przypisany_do = k.id_konta); Skumulowany efekt niedokïadnoĂci liczb zmiennoprzecinkowych jest jesz- cze bardziej widoczny podczas wyznaczania zagregowanego iloczynu zbioru liczb (zamiast ich sumy). Poszczególne róĝnice wydajÈ siÚ niewiel- kie, ale z czasem mocno rosnÈ. JeĂli na przykïad pomnoĝymy wartoĂÊ 1 przez wspóïczynnik równy dokïadnie 1,0, wynik zawsze bÚdzie wynosiï 1. Nie ma znaczenia, ile razy zastosujemy ten mnoĝnik. JeĂli jednak uĝyjemy wspóïczynnika 0,999, wynik bÚdzie inny. JeĂli kolejno pomnoĝymy liczbÚ 1 przez wartoĂÊ 0,999 tysiÈc razy, otrzymamy wynik równy okoïo 0,3677. Im wiÚcej operacji mnoĝenia wykonamy, tym wiÚksza bÚdzie ta rozbieĝnoĂÊ. Dobrym przykïadem stosowania operacji wielokrotnego mnoĝenia jest wyznaczanie ïÈcznego oprocentowania na potrzeby kalkulacji finanso- wych. Uĝywanie niedokïadnych liczb zmiennoprzecinkowych powoduje bïÚdy, które poczÈtkowo wydajÈ siÚ zupeïnie niegroěne, ale z czasem, sku- mulowane, zaczynajÈ stwarzaÊ powaĝne problemy. Stosowanie precyzyj- nych wartoĂci w aplikacjach finansowych jest wiÚc bardzo waĝne. 10.3. Jak rozpoznaÊ ten antywzorzec Niemal kaĝde uĝycie typów danych FLOAT, REAL lub DOUBLE PRECISION jest podejrzane. WiÚkszoĂÊ aplikacji korzystajÈcych z liczb zmiennoprzecinko- wych w rzeczywistoĂci nie potrzebuje przedziaïu wartoĂci obsïugiwanego przez formaty zgodne ze standardem IEEE 754. Korzystanie z typów danych FLOAT w jÚzyku SQL wydaje siÚ o tyle natural- ne, ĝe podobny typ (czÚsto nawet pod tÈ samÈ nazwÈ) wystÚpuje w wiÚk- szoĂci jÚzyków programowania. Okazuje siÚ jednak, ĝe moĝna wybraÊ lepszy typ danych. 150  Rozdziaï 10. • BïÚdy zaokrÈgleñ 10.4. Usprawiedliwione uĝycia tego antywzorca FLOAT jest dobrym typem danych w sytuacji, gdy potrzebujemy liczb rze- czywistych z przedziaïu wiÚkszego niĝ ten obsïugiwany przez typy INTEGER i NUMERIC. Naukowe aplikacje czÚsto wskazuje siÚ jako przykïad uzasadnio- nego stosowania typu FLOAT. W systemie Oracle typu danych FLOAT uĝywa siÚ do wyraĝania dokïadnie skalowanych wartoĂci liczbowych, zaĂ do reprezentowania niedokïadnych wartoĂci numerycznych stosuje siÚ typ danych BINARY_FLOAT (zgodny ze stan- dardem kodowania IEEE 754). 10.5. RozwiÈzanie: stosowanie typu danych NUMERIC Zamiast typu FLOAT i typów pokrewnych moĝemy stosowaÊ typy danych NUMERIC lub DECIMAL jÚzyka SQL dla liczb uïamkowych staïej precyzji. Plik BïÚdy-zaokrÈgleñ/roz/numeric-columns.sql ALTER TABLE Bledy ADD COLUMN godziny NUMERIC(9,2); ALTER TABLE Konta ADD COLUMN stawka_godzinowa NUMERIC(9,2); Wymienione typy danych umoĝliwiajÈ dokïadne reprezentowanie wartoĂci numerycznych z maksymalnÈ precyzjÈ okreĂlonÈ podczas definiowania odpowiednich kolumn. PrecyzjÚ naleĝy okreĂliÊ w formie argumentu typu danych — obowiÈzujÈca skïadnia przypomina trochÚ sposób okreĂlania dïugoĂci typu danych VARCHAR. Precyzja to ïÈczna liczba cyfr dziesiÚtnych, których moĝemy uĝywaÊ dla wartoĂci w tak zdefiniowanej kolumnie. Precy- zja równa 9 oznacza, ĝe moĝemy przechowywaÊ takie wartoĂci jak 123456789, ale najprawdopodobniej nie bÚdziemy mogli obsïuĝyÊ wartoĂci równej 1234567890.1 1 W niektórych systemach baz danych rozmiar tej kolumny jest zaokrÈglany w górÚ do najbliĝszego bajta, sïowa lub podwójnego sïowa, zatem w pewnych przypadkach maksymalna wartoĂÊ w kolumnie typu NUMERIC moĝe skïadaÊ siÚ z wiÚkszej liczby cyfr, niĝ to wynika ze wskazanej precyzji. 10.5. RozwiÈzanie: stosowanie typu danych NUMERIC  151 Istnieje teĝ moĝliwoĂÊ okreĂlenia skali za poĂrednictwem drugiego argu- mentu tego typu danych. Skala decyduje o liczbie cyfr na prawo od prze- cinka oddzielajÈcego czÚĂÊ caïkowitÈ od uïamkowej. Cyfry skali sÈ odli- czane od liczby cyfr precyzji, zatem precyzja 9 ze skalÈ 2 oznaczajÈ, ĝe moĝemy przechowywaÊ takie wartoĂci jak 1234567.89, ale juĝ nie wartoĂci 12345678.91 czy 123456.789. OkreĂlane przez nas precyzja i skala sÈ stosowane dla danej kolumny we wszystkich wierszach tabeli. Innymi sïowy, nie moĝemy przechowywaÊ wartoĂci ze skalÈ 2 w czÚĂci wierszy i wartoĂci ze skalÈ 4 w pozostaïych. W jÚzyku SQL to naturalne, ĝe typ danych kolumny jest konsekwentnie stosowany dla wszystkich wierszy (tak jak w przypadku kolumny typu VARCHAR(20), gdzie kaĝdy wiersz moĝe zawieraÊ ïañcuch okreĂlonej dïugoĂci). ZaletÈ typów NUMERIC i DECIMAL jest moĝliwoĂÊ przechowywania liczb wymier- nych bez ryzyka ich zaokrÈglania (jak w przypadku typu FLOAT). Po zapi- saniu wartoĂci 59.95 moĝemy byÊ pewni, ĝe w bazie danych jest przecho- wywana dokïadnie ta liczba. JeĂli porównamy jÈ ze staïÈ wartoĂciÈ 59.95, okaĝe siÚ, ĝe obie wartoĂci sÈ sobie równe. Plik BïÚdy-zaokrÈgleñ/roz/exact.sql SELECT stawka_godzinowa FROM Konta WHERE stawka_godzinowa = 59.95; Zwraca: 59.95 Podobnie, jeĂli pomnoĝymy tÚ wartoĂÊ przez miliard, otrzymamy oczeki- wanÈ wartoĂÊ: Plik BïÚdy-zaokrÈgleñ/roz/magnify-rate-exact.sql SELECT stawka_godzinowa * 1000000000 FROM Konta WHERE stawka_godzinowa = 59.95; Zwraca: 59950000000 Typy danych NUMERIC i DECIMAL zachowujÈ siÚ identycznie; nie powinny wystÚpowaÊ ĝadne róĝnice w ich dziaïaniu. Istnieje teĝ synonim DEC dla typu danych DECIMAL. Nadal nie moĝemy przechowywaÊ wartoĂci wymagajÈcych nieskoñczonej precyzji, na przykïad jednej trzeciej. Proponowane typy umoĝliwiajÈ nam jednak przechowywanie dokïadnej reprezentacji liczb w formie, w której zapisujemy je w systemie dziesiÚtnym. 152  Rozdziaï 10. • BïÚdy zaokrÈgleñ JeĂli wiÚc potrzebujemy dokïadnych wartoĂci dziesiÚtnych, powinniĂmy posïu- giwaÊ siÚ typem danych NUMERIC. Typ danych FLOAT nie moĝe reprezento- waÊ wielu dziesiÚtnych liczb wymiernych, zatem wartoĂci tego typu naleĝy zawsze traktowaÊ jako niedokïadne. JeĂli tylko moĝemy tego uniknÈÊ, nie powinniĂmy uĝywaÊ typu FLOAT. Skorowidz .dump, 169 1NF, Patrz pierwsza postaÊ normalna 2NF, Patrz druga postaÊ normalna 3NF, Patrz trzecia postaÊ normalna 4NF, Patrz czwarta postaÊ normalna 5NF, Patrz piÈta postaÊ normalna A ABS(), 148 Active Record, 109, 350, 351, 352, 353, 357, 358 Adams, Douglas, 85 adjacency list, Patrz lista sÈsiedztwa agregujÈce zapytania, tworzenie, 28, 33 aktualizacje kaskadowe, 82, 83 algorytm SHA-1, 282 SHA-256, 281 Anemic Domain Model, Patrz antywzorzec, anemiczny model dziedzinowy anomalia, 375 ANSI SQL, standard, 180 antywzorzec, 14, 16 31 smaków, 153 rozpoznawanie, 159 usprawiedliwione uĝycie, 160 anemiczny model dziedzinowy, 353 atrybuty wielokolumnowe, 117, 123 rozpoznawanie, 122 usprawiedliwione uĝycie, 123 bïÚdy zaokrÈgleñ, 143 rozpoznawanie, 149 usprawiedliwione uĝycie, 150 czytelne hasïa, 275 rozpoznawanie, 279 usprawiedliwione uĝycie, 280 encja-atrybut-wartoĂÊ, 85, 86 rozpoznawanie, 93 usprawiedliwione uĝycie, 94 zwiÈzki encji, 88 identyfikator potrzebny od zaraz, 61 rozpoznawanie, 69 usprawiedliwione uĝycie, 70 immunitet dyplomatyczny, 331 rozpoznawanie, 334 usprawiedliwione uĝycie, 335 388  antywzorzec losowy wybór, 223 rozpoznawanie, 226 usprawiedliwione uĝycie, 227 magiczna fasola, 347 rozpoznawanie, 356 testowanie architektury MVC, 355 usprawiedliwione uĝycie, 357 naiwne drzewa, 37 rozpoznawanie, 43 usprawiedliwione uĝycie, 44 niejasne grupy, 209 rozpoznawanie, 214 usprawiedliwione uĝycie, 215 obsesja czystoĂci pseudokluczy, 309 rozpoznawanie, 314 usprawiedliwione uĝycie, 314 pliki-widma, 165 rozpoznawanie, 171 usprawiedliwione uĝycie, 172 przechodzenie na czerwonym Ăwietle, 25, 26, 123 rozpoznawanie, 31 usprawiedliwione uĝycie, 31 przymykanie oczu na zïo, 321 rozpoznawanie, 326 usprawiedliwione uĝycie, 327 strach przed nieznanym, 195 rozpoznawanie, 201 usprawiedliwione uĝycie, 202 strzelanie indeksami, 177, 185 rozpoznawanie, 184 usprawiedliwione uĝycie, 184 tribble metadanych, 127 rozpoznawanie, 134 usprawiedliwione uĝycie, 135 ukryte kolumny, 263 rozpoznawanie, 267 usprawiedliwione uĝycie, 268 Antywzorce jÚzyka SQL wpis bez klucza, 75 rozpoznawanie, 80 usprawiedliwione uĝycie, 81 wstrzykiwanie SQL-a, 289 rozpoznawanie, 299 usprawiedliwione uĝycie, 300 wyszukiwarka nÚdzarza, 233 rozpoznawanie, 236 usprawiedliwione uĝycie, 237 zapytanie-spaghetti, 251 rozpoznawanie, 256 usprawiedliwione uĝycie, 257 zïotego mïotka, 351 zwiÈzki polimorficzne, 103 diagram zwiÈzków encji, 105 podobieñstwo do antywzorca encja-atrybut-wartoĂÊ, 106 rozpoznawanie, 109 usprawiedliwione uĝycie, 110 Apache Lucene, 245 archiwizacja, 135 atrybuty wielowartoĂciowe, przechowywanie, 118 AUTO_INCREMENT, 63 AVG(), 28 B Babbage, Charles, 177 Baruch, Bernard, 309 bazy danych kopie zapasowe, 169 relacyjne, 368 spójnoĂÊ, 79 uproszczenie architektury, 76 wydajnoĂÊ, 178 BCNF, Patrz Boyce’a-Codda, postaÊ normalna Berkeley DB, 94 Skorowidz  389 BLOB, 173, 174 bïÚdy, obsïuga, 327 Bohr, Niels, 11 Born, Max, 209 Boyce’a-Codda, postaÊ normalna, 377, 378 C Cassandra, 94 CAST(), 295 CATSEARCH(), 239 CHECK, 155, 157, 159, 160 Class Table Inheritance, 99 close(), 327 closure table, Patrz tabela domkniÚcia COALESCE(), 113, 207 Codd, E. F., 86, 201 COMMIT, 168 common table expression, Patrz wspólne wyraĝenie tablicowe Concrete Table Inheritance, 97, 98 CONNECT BY PRIOR, 45, 58 CONTAINS(), 240, 241 CONTEXT, 239 ConText, moduï, 239 ConvertEmptyStringToNull, 203 Cosby, Bill, 182 CouchDB, 94 COUNT(), 28, 41 covering index, Patrz indeksy pokrywajÈce Coveyou, Robert R., 223 CREATE INDEX, 180 CRUD, 350 CTE, Patrz wspólne wyraĝenie tablicowe CTI, Patrz Concrete Table Inheritance CTXCAT, 239 CTXRULE, 240 CTXXPATH, 240 czwarta postaÊ normalna, 379, 380 D dane hierarchiczne, przechowywanie, 58, 59 dane poczÈtkowe, 341 dane semistrukturalne, 100 DAO, 359 Date, C. J., 201 DEC, Patrz DECIMAL DECIMAL, 150, 151 zalety, 151 deklaratywny jÚzyk programowania, 12 DELETE, 168, 179 denormalizacja, 31 diagram interakcji klas, 355 diagram zwiÈzków encji, 18, 19 dla listy sÈsiedztwa, 39 dla tabeli ïÈczÈcej, 32 DISTINCT, 214 DKNF, Patrz dziedzina-klucz, postaÊ normalna dïug techniczny, 332 dokumentacja, 336 bezpieczeñstwo SQL-a, 338 diagram zwiÈzków encji, 337 infrastruktura bazy danych, 339 odwzorowania obiektowo-relacyjne, 339 procedury skïadowane, 338 relacje, 338 tabela, kolumny, perspektywy, 337 wyzwalacze, 338 domain-Key normal form, Patrz dziedzina-klucz, postaÊ normalna Don t Repeat Yourself, Patrz nie powtarzaj siÚ, zasada 390  Antywzorce jÚzyka SQL dopasowywanie wzorców, 235, 236, 237 DOUBLE PRECISION, 146 druga postaÊ normalna, 374, 375 DRY, Patrz nie powtarzaj siÚ, zasada drzewiasta struktura danych, 38 FLOAT, 144, 145, 146 Forster, E. M., 263 Fowler, Martin, 350, 353 FTS, rozszerzenia, 242 full-text search, Patrz wyszukiwanie korzeñ, 38 liĂcie, 38 przykïady stosowania, 38 wÚzeï, 38 wÚzïy niebÚdÈce liĂÊmi, 38 dodawanie liĂci, 42 usuniÚcie poddrzewa, 42 usuniÚcie wÚzïa, 42, 43 zmiana poïoĝenia wÚzïa drzewo lub poddrzewa, 42 dynamiczny SQL, 290 dziedzina-klucz, postaÊ normalna, 382 E EAW, Patrz antywzorzec, encja- atrybut-wartoĂÊ entity relationship diagram, Patrz diagram zwiÈzków encji Entity-Attribute-Value, Patrz antywzorzec, encja-atrybut-wartoĂÊ ENUM, 155, 157, 159, 160 enumeracja Ăcieĝki, 46, 49, 58 wady, 48 wstawianie wÚzïa, 48 ER, Patrz diagram zwiÈzków encji ETL, 158 execute(), 324 F fetch(), 324 FILESTREAM, 172 find(), 350 functional dependency, Patrz zaleĝnoĂci peïnotekstowe funkcjonalne funkcja skrótu, 281 funkcje okien, 315 G generalized inverted index, Patrz uogólniony indeks odwrotny GENERATOR, 63 generowanie kodu, 261 GIN, Patrz uogólniony indeks odwrotny Glass, Robert L., 349 globally unique identifier, Patrz globalnie unikatowy identyfikator globalnie unikatowy identyfikator, 316 Gonzalez, Albert, 289, 290 GRANT, 170 GROUP BY, 210, 211, 214 GROUP_CONCAT(), 220 GUID, Patrz globalnie unikatowy identyfikator H Hadoop, 94 hash function, Patrz kryptograficzna funkcja skrótu hash(), 286 hasïa algorytm SHA-1, 282 algorytm SHA-256, 281 kryptograficzna funkcja skrótu, 281 Skorowidz  391 MD5(), 282 przechowywanie, 276, 277 przechowywanie zabezpieczonych kodów haseï, 281 resetowanie, 286 sól, 284 uwierzytelnianie, 278 wysyïanie pocztÈ elektronicznÈ, 279 HBase, 94 Hibernate, framework, 109, 110 hierarchia, 59 Hooper, Grace Murray, 331 horizontal partitioning sharding, Patrz partycjonowanie poziome I id, kolumna, 64, 65 IDENTITY, 63 IEEE 754, standard, 146, 147 iloczyn kartezjañski, 253, 254 impedance mismatch, Patrz niezgodnoĂÊ impedancji indeks odwrócony, 246 indeks peïnotekstowy, 238 indeksy, 178, 179, 182, 191 bïÚdy, 179 brak, 179 pokrywajÈce, 190 selektywnoĂÊ, 185 stosowanie bez planu, 179 zbyt wiele, 181 INSERT, 161, 179, 266 integralnoĂÊ danych, zarzÈdzanie, 130 integralnoĂÊ odwoïañ, 76, 77 zarzÈdzanie, 133 intersection table, Patrz tabela ïÈczÈca inverted index, Patrz indeks odwrócony IS DISTINCT FROM, 205, 206 IS NOT NULL, 205 IS NULL, 205 ISO/IEC 11179, standard, 71 J Jaywalking, Patrz antywzorzec, przechodzenie na czerwonym Ăwietle jeden-do-wielu, relacja, 27 jÚzyk definiowania danych, 15 jÚzyk przetwarzania danych, 15 JOIN, 67 join dependency, Patrz zaleĝnoĂci zïÈczeniowe K kaskadowe aktualizacje, 82, 83 Kernighan, Brian, 143 Kirk, James T., 127 klucz gïówny, 62, 63, 69, 70, 315 klucz zastÚpczy, Patrz pseudoklucz klucz zïoĝony, 65, 68, 69, 72 kod generowanie, 261 system kontroli, 341 kolumny, klonowanie, 129 kontrola jakoĂci, 336 czemu jest waĝny, 64 niejasnoĂci, 62 unikatowoĂÊ, 132 warunki, 64 wybieranie nazwy, 70, 71 wybór, 63 klucz naturalny, 72, 314, 318 klucz obcy, 62, 68, 73, 82, 83 koszty rezygnacji, 77 niechÚÊ, 76, 79 wybieranie nazwy, 71 zalety, 84 392  Antywzorce jÚzyka SQL konwencja ponad konfiguracjÈ, 70 korzeñ, 38 kryptograficzna funkcja skrótu, 281 L LAST_INSERT_ID(), 48, 68 law of parsimony, Patrz prawo prostoty leaky abstractions, Patrz nieszczelne abstrakcje leaves, Patrz liĂcie Letwin, Gordon, 78 liczby caïkowite, 144, 317 liczby zmiennoprzecinkowe, 145, 146, 147 LIKE, 189, 235 LIMIT, 230 lista sÈsiedztwa, 40, 41, 44, 57, 58 lista, ograniczenie dïugoĂci, 35 liĂcie, 38 LOAD_FILE(), 174 log_min_duration_statement, 187 LONG, 174 long_query_time, 186 Lucene, Patrz Apache Lucene M Marx, Groucho, 289 MATCH(), 238 MAX(), 212 MD5(), 282 MEDIUMBLOB, 174 Mencken, H. L., 347 MENTOR, 185, 186 mierzenie, 186 optymalizacja, 191 przebudowa, 191 testowanie, 191 wskazanie, 189 wyjaĂnienie, 188 metadane, 155 zmiana, 158 Microsoft SQL Server, wyszukiwanie peïnotekstowe, 240 mieszanie danych z metadanymi, 106, 129 migracja, 340, 341 mistake-proofing, Patrz poka-yoke Model-View-Controller, Patrz model-widok-komponent model-widok-komponent, 349, 360 MongoDB, 95 MVC, Patrz model-widok-komponent mysqldump, 169 N nadmiarowoĂÊ, 375, 377 Neumann, John von, 367 NF, Patrz postacie normalne nie powtarzaj siÚ, zasada, 357 nieskoñczona precyzja, 145 nieszczelne abstrakcje, 351 niezgodnoĂÊ impedancji, 13 node, Patrz wÚzeï noleaf nodes, Patrz wÚzïy niebÚdÈce liĂÊmi normal form, Patrz postacie normalne normalizacja cele, 372 mity, 371 reguïy, 367, 383 NOT NULL, 200, 206 NULL, 196, 197, 201 w parametrach zapytañ, 198 w wyraĝeniach, 197 w wyraĝeniach logicznych, 204 w wyraĝeniach skalarnych, 203 wyszukiwanie wartoĂci, 205 Skorowidz NULLIF(), 120 NUMERIC, 150, 151 zalety, 151 O obiektowy diagram klas, 87 obiektowy model programowania, 86 object-relational mapping, Patrz odwzorowania obiektowo-relacyjne obrazy, przechowywanie, 166, 172, 173, 174, 175 obsïuga bïÚdów, 327 Ockham, William, 251, 257 odwzorowania obiektowo-relacyjne, 267 okien, funkcje, 315 ON, 67 ON DELETE CASCADE, 43 optymalizacja wydajnoĂci, 178 Oracle, indeksowanie tekstu, 239 ORDER BY, 369 ORM, Patrz odwzorowania obiektowo-relacyjne Orwell, George, 61 otwarty schemat, 88 outer join, Patrz zïÈczenie zewnÚtrzne P Paine, Thomas, 117 para nazwa-wartoĂÊ, 88 partycjonowanie pionowe, 138 poziome, 137 PDO::quote(), 303 perspektywy, 337 perspektywy systemowe, 156 pg_dump, 169 pgFouine, 187  393 piÈta postaÊ normalna, 380, 382 pierwsza postaÊ normalna, 373, 374 plan wykonania zapytania, 188 pliki, 167, 168, 169, 170 podzapytania skorelowane, 217 poka-yoke, 81, 82 polimorfizm, 114 Polymorphic Associations, Patrz zwiÈzki polimorficzne Popper, Karl, 165 postacie normalne, 372 Boyce’a-Codda, 377, 378 czwarta postaÊ normalna, 379, 380 druga postaÊ normalna, 374, 375 dziedzina-klucz, 382 hierarchia, 373 piÈta postaÊ normalna, 380, 382 pierwsza postaÊ normalna, 373, 374 szósta postaÊ normalna, 383 trzecia postaÊ normalna, 376, 377 PostgreSQL, wyszukiwanie tekstu, 241 prawo oszczÚdnoĂci, 257, 258 prawo prostoty, 257 precyzja nieskoñczona, 145 skoñczona, 145 prepare(), 324 PRIMARY KEY, 125 procedury skïadowe, 297 projekt bez schematu, 88 projektowanie defensywne, 367 promiscuous asssociation, Patrz zwiÈzek mieszany pseudoklucz, 63, 70, 71, 72, 315, 317, 319 standardy, 63 terminologia, 63 394  Antywzorce jÚzyka SQL Q QEP, Patrz plan wykonania zapytania query execution plan, Patrz plan wykonania zapytania quote(), 294 R race condition, Patrz sytuacja wyĂcigu RAND(), 225 Ratcliffe, Mitch, 313 RAW, 174 Reagan, Ronald, 37 REAL, 146 Redis, 95 reguïa jednej wartoĂci, 211, 213 naruszenie, 214 relacja, 368 jeden-do-wielu, 27 wiele-do-jednego, 27 wiele-do-wielu, 32, 69 REVOKE, 170 rman, 169 ROLLBACK, 169 root, Patrz korzeñ Ross, Blake, 25 ROW_NUMBER(), 230, 315 ROWID, 63 Ruby on Rails, 71, 109, 340, 351 Rumsfeld, Donald, 195 S salt, Patrz sól SAMPLE, 231 SCOPE_IDENTITY(), 68 seed data, Patrz dane poczÈtkowe sekwencje, 68 semistrukturalne dane, 100 separator, wybór, 34 SEQUENCE, 63 SequenceName.CURRVAL(), 68 SERIAL, 63 Serialized LOB, 100 SHA-1, algorytm, 282 SHA-256, algorytm, 281 Single Table Inheritance, 96, 97 single-value rule, Patrz reguïa jednej wartoĂci skanowanie tabeli, 226 skoñczona precyzja, 145 skrótu, funkcja, 281 Solr, 246 sortowanie, 225, 226, 228 sól, 284 Sphinx Search, 244, 245 Spolsky, Joel, 351 SQL injection, Patrz wstrzykiwanie SQL-a SQL Server Profiler, 186 SQL Trace, 186 SQL, jÚzyk, 12 automatyczne pisanie kodu, 261 dopasowywanie do wzorca, 28 dynamiczny, 290 SQL:2003, standard, 315 SQL-99, standard, 45, 205, 235 SQLite, wyszukiwanie peïnotekstowe, START WITH, 45 STI, Patrz Single Table Inheritance stored procedures, Patrz procedury skïadowe 242 standard ANSI SQL, 180 IEEE 754, 146, 147 ISO/IEC 11179, 71 SQL:2003, 315 SQL-99, 45, 205, 235 Skorowidz  395 SUM(), 28, 41, 149 surrogate key, Patrz pseudoklucz symbol ucieczki, 294 symbole wieloznaczne, 264, 268, 271 koszty, 266 symbole zastÚpcze parametrów, 295 synchronizacja danych, 131 synchronizacja metadanych, 133 sytuacja wyĂcigu, 68 szósta postaÊ normalna, 383 T tabela atrybutów, 87 atrybut, 87 encja, 87 wartoĂÊ, 88 ilustracja, 54 tabela domkniÚcia, 46, 53, 57, 58 tabela ïÈczÈca, 32, 65, 69 diagram zwiÈzków encji, 32 zalety, 35 tabela pochodna, 217, 218 tabela wiele-do-wielu, Patrz tabela ïÈczÈca tabela wirtualna, 242 tabela wyszukiwania, 163 aktualizowanie wartoĂci, 161 tabele klonowanie, 129 skanowanie, 226 table scan, Patrz skanowanie tabeli TABLESAMPLE, 231 technical debt, Patrz dïug techniczny testowanie, 342 dane poczÈtkowe, 344 izolacja, 342 klasy odwzorowañ obiektowo-relacyjnych, 345 ograniczenia, 344 procedury skïadowane, 344 tabele, kolumny, perspektywy, 343 wyzwalacze, 344 zapytania, 344 testy negatywne, 343 TKProf, 186 Tokyo Cabinet, 95 trzecia postaÊ normalna, 376, 377 typy definiowane przez uĝytkownika, 156 Tzu, Sun, 75 U UDT, Patrz typy definiowane przez uĝytkownika unikatowoĂÊ, 132 UNION, 133, 259 uogólniony indeks odwrotny, 242 UPDATE, 179 user-defined types, Patrz typy definiowane przez uĝytkownika USING, 67 uĝytkownik identyfikacja, 280 uwierzytelnianie, 280 Valéry, Paul, 153 V W wczesne wywoïywanie awarii, zasada, 270 wÚzeï, 38 wÚzïy niebÚdÈce liĂÊmi, 38 WHERE, 198 wiele-do-jednego, relacja, 27 396  Antywzorce jÚzyka SQL zapytania rekurencyjne, 58 zapytania, czas wykonywania, 186 zapytanie, 18 Zawinski, Jamie, 233 zbiory zagnieĝdĝone, 46, 49, 53, 57, 58 ilustracja, 50 wstawianie wÚzïa, 52 zalety, 51 zïÈczenie, 219 zewnÚtrzne, 219 zwiÈzek mieszany, 105 zwiÈzki polimorficzne, 105 definiowanie, 105 odwracanie odwoïañ, 110 zapytania, 106 wiele-do-wielu, relacja, 32, 69 wiÚzy integralnoĂci, 76 wildcard, Patrz symbole wieloznaczne WITH, 45, 58 wspólne wyraĝenie tablicowe, 45 wstrzykiwanie SQL-a, 290, 291, 292, 293 zabezpieczenia, 301 wydajnoĂÊ, 178 optymalizacja, 178 wyraĝenia regularne, 235, 236 wyraĝenie, 18 wyszukiwanie peïnotekstowe, 238 Microsoft SQL Server, 240 SQLite, 242 wzorce, dopasowywanie, 28, 235, 236, 237 Z zaleĝnoĂci funkcjonalne, 216 zaleĝnoĂci zïÈczeniowe, 383 zaokrÈglanie, 145 zapytania agregujÈce, tworzenie, 28, 33
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Antywzorce języka SQL. Jak unikać pułapek podczas programowania baz danych
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: