Błędy w tworzeniu baz danych popełniane przez twórców aplikacji [zamknięty]

Jakie są typowe błędy w tworzeniu baz danych popełniane przez twórców aplikacji?

Author: Charles Faiga, 2009-03-07

30 answers

1. Brak odpowiednich wskaźników

Jest to stosunkowo łatwe, ale ciągle się to zdarza. Klucze obce powinny mieć indeksy. Jeśli używasz pola w WHERE, powinieneś (prawdopodobnie) mieć na nim indeks. Takie indeksy powinny często obejmować wiele kolumn w oparciu o zapytania, które musisz wykonać.

2. Nie egzekwowanie integralności odniesienia

Twoja baza danych może się tutaj różnić, ale jeśli twoja baza danych obsługuje referential integralność-co oznacza, że wszystkie klucze obce są gwarantowane, aby wskazywały na istniejącą jednostkę - powinieneś jej używać.

To dość powszechne, aby zobaczyć tę awarię w bazach danych MySQL. Nie wierzę, że MyISAM to popiera. InnoDB tak. Znajdziesz osoby, które używają MyISAM lub te, które używają InnoDB, ale i tak go nie używają.

Więcej tutaj:

3. Używanie naturalnych zamiast zastępczych (technicznych) kluczy podstawowych

Klucze naturalne to klucze oparte na danych mających znaczenie zewnętrzne, które są (pozornie) unikalne. Typowe przykłady to kody produktów, dwuliterowe kody Stanów (USA), numery ubezpieczenia społecznego i tak dalej. Surogat lub Technical primary klucze to te, które nie mają absolutnie żadnego znaczenia poza systemem. Są one wymyślone wyłącznie w celu identyfikacji podmiotu i są zazwyczaj automatycznie inkrementującymi polami (SQL Server, MySQL, inne) lub sekwencjami (w szczególności Oracle).

Moim zdaniem powinieneś zawsze używać kluczy zastępczych. Ten problem pojawił się w tych pytaniach:

Jest to dość kontrowersyjny temat, w którym nie uzyskasz powszechnej zgody. Chociaż możesz znaleźć ludzi, którzy uważają, że klucze naturalne są w niektórych sytuacjach OK, nie znajdziesz żadnej krytyki kluczy zastępczych innych niż prawdopodobnie niepotrzebne. To dość mały minus, jeśli O mnie chodzi.

Pamiętaj, że nawet kraje mogą przestać istnieć (na przykład Jugosławia).

4. Pisanie zapytań wymagających DISTINCT do pracy

Często widzisz to w zapytaniach generowanych przez ORM. Spójrz na wyjście dziennika z Hibernate i zobaczysz, że wszystkie zapytania zaczynają się od:

SELECT DISTINCT ...

Jest to skrót do zapewnienia, że nie zwracasz zduplikowanych wierszy, a tym samym otrzymujesz zduplikowane obiekty. Będziesz czasem zobacz, jak ludzie to robią. Jeśli widzisz to za dużo, to jest to prawdziwa czerwona flaga. Nie, że DISTINCT jest zły lub nie ma ważnych aplikacji. Tak (w obu przypadkach), ale nie jest to zastępczy lub stopgap do pisania poprawnych zapytań.

From Why I Hate :

Gdzie rzeczy zaczynają się kwaskać w moim opinia jest wtedy, gdy deweloper jest budowanie merytorycznych zapytań, łączenie stoły razem i nagle zdaje sobie sprawę, że to wygląda jak on na uzyskiwanie duplikatów (lub nawet więcej) wierszy i jego natychmiastowej reakcji...on "rozwiązaniem" tego "problemu" jest wrzuć na osobne słowo kluczowe i POOF wszystkie jego kłopoty znikają.

5. Favoring agregation over joins

Innym częstym błędem twórców aplikacji bazodanowych jest nie zdawanie sobie sprawy z tego, o ile droższą agregację (tj. klauzulę GROUP BY) można porównać do łączenia.

Aby dać ci wyobrażenie o tym, jak powszechne jest to, Pisałem na ten temat kilka razy tutaj i byłem za to odrzucony. Na przykład:

From polecenie SQL - "join" vs "group by and having":

Pierwsze zapytanie:

SELECT userid
FROM userrole
WHERE roleid IN (1, 2, 3)
GROUP by userid
HAVING COUNT(1) = 3

Query time: 0.312 s

Drugie zapytanie:

SELECT t1.userid
FROM userrole t1
JOIN userrole t2 ON t1.userid = t2.userid AND t2.roleid = 2
JOIN userrole t3 ON t2.userid = t3.userid AND t3.roleid = 3
AND t1.roleid = 1

Query time: 0.016 s

Zgadza się. Wersja join i proponowane jest dwadzieścia razy szybciej niż wersja zbiorcza.

6. Nie upraszczając złożone zapytania poprzez widoki

Nie wszyscy dostawcy baz danych obsługują widoki, ale dla tych, którzy to robią, mogą znacznie uprościć zapytania, jeśli są używane rozsądnie. Na przykład, w jednym projekcie użyłem generic Party model dla CRM. Jest to niezwykle potężna i elastyczna technika modelowania, ale może prowadzić do wielu połączeń. W tym modelu były:

  • partia : Ludzie i organizacje;
  • rola partii : rzeczy, które zrobiły te partie, dla przykład pracownika i pracodawcy;
  • związek ról partyjnych: jak te role się ze sobą wiążą.

Przykład:

    Ted jest osobą, będącą podtypem strony; [35]} Ted ma wiele ról, z których jedna jest pracownikiem;]} Intel jest organizacją, będącą podtypem strony; [35]} Intel ma wiele ról, z których jedna jest pracodawcą;]}
  • Intel zatrudnia Teda, co oznacza, że istnieje związek między ich odpowiednikami role.

Więc jest pięć tabel połączonych, aby połączyć Teda z jego pracodawcą. Zakładasz, że wszyscy pracownicy są osobami (nie organizacjami) i udostępniasz ten widok pomocy: {]}

CREATE VIEW vw_employee AS
SELECT p.title, p.given_names, p.surname, p.date_of_birth, p2.party_name employer_name
FROM person p
JOIN party py ON py.id = p.id
JOIN party_role child ON p.id = child.party_id
JOIN party_role_relationship prr ON child.id = prr.child_id AND prr.type = 'EMPLOYMENT'
JOIN party_role parent ON parent.id = prr.parent_id = parent.id
JOIN party p2 ON parent.party_id = p2.id

I nagle masz bardzo prosty widok danych, które chcesz, ale na bardzo elastycznym modelu danych.

7. Nie dezynfekujące wejście

Ten jest ogromny. Teraz lubię PHP, ale jeśli nie wiesz, co robisz, naprawdę łatwo jest tworzyć strony podatne na ataki. Nic. podsumowuje to lepiej niż historia stolików little Bobby .

Dane dostarczane przez Użytkownika za pomocą adresów URL, danych formularza i plików cookie powinny być zawsze traktowane jako wrogie i dezynfekowane. Upewnij się, że dostajesz to, czego oczekujesz.

8. Nieużywanie gotowych wypowiedzi

Gotowe instrukcje są wtedy, gdy kompilujesz zapytanie minus dane używane w klauzulach inserts, updates I WHERE, a następnie dostarczasz je później. Na przykład:

SELECT * FROM users WHERE username = 'bob'

Vs

SELECT * FROM users WHERE username = ?

Lub

SELECT * FROM users WHERE username = :username

W zależności od platformy.

/ Align = "left" / Zasadniczo, za każdym razem, gdy nowoczesna baza danych napotka nowe zapytanie, musi je skompilować. Jeśli napotka zapytanie, które było wcześniej widziane, dajesz bazie danych możliwość buforowania skompilowanego zapytania i planu wykonania. Wykonując wiele zapytań dajesz bazy danych możliwość dowiedzieć się, że i odpowiednio zoptymalizuj (na przykład, przypinając skompilowane zapytanie do pamięci).

Korzystanie z gotowych instrukcji da Ci również znaczące statystyki dotyczące tego, jak często używane są określone zapytania.

Przygotowane instrukcje będą również lepiej chronić Cię przed atakami SQL injection.

9. Za mało normalizacji

Normalizacja bazy danych jest w zasadzie procesem optymalizacji projektu bazy danych lub organizacji danych w stoły.

W tym tygodniu natknąłem się na jakiś kod, w którym ktoś wszczepił tablicę i wstawił ją do pojedynczego pola w bazie danych. Normalizacja polegałaby na traktowaniu elementu tej tablicy jako osobnego wiersza w tabeli potomnej(tj. relacji jeden do wielu).

Pojawiła się również w najlepsza metoda przechowywania listy identyfikatorów użytkowników :

Widziałem w innych systemach, że lista jest przechowywana w seryjnej tablicy PHP.

Ale brak normalizacja występuje w wielu formach.

Więcej:

10. Za dużo normalizacji

Może się to wydawać sprzecznością z poprzednim punktem, ale normalizacja, jak wiele rzeczy, jest narzędziem. Jest środkiem do celu, a nie celem samym w sobie. Myślę, że wielu programistów zapomina o tym i zaczyna traktować "oznacza" jako "koniec". Testowanie jednostkowe jest tego doskonałym przykładem.

Kiedyś pracowałem nad systemem, który miał ogromną hierarchię dla klientów, który poszedł coś w stylu:]}
Licensee ->  Dealer Group -> Company -> Practice -> ...

Tak, że trzeba było połączyć około 11 tabel razem, zanim można było uzyskać jakiekolwiek znaczące dane. Był to dobry przykład normalizacji podjętej zbyt daleko.

[15]}bardziej do punktu, ostrożny i rozważony denormalizacja może mieć ogromne korzyści wydajności, ale trzeba być bardzo ostrożnym, gdy robi to.

Więcej:

11. Korzystanie z ekskluzywnych łuków

Ekskluzywny łuk jest powszechnym błąd, w którym tabela jest tworzona z dwoma lub więcej kluczami obcymi, gdzie jeden i tylko jeden z nich może być inny niż null. Wielki błąd. Po pierwsze, utrzymanie integralności danych staje się o wiele trudniejsze. W końcu, nawet przy integralności odniesienia, nic nie stoi na przeszkodzie, aby ustawić dwa lub więcej z tych kluczy obcych (niezależnie od złożonych ograniczeń sprawdzania).

From A Practical Guide to relational Database Design :

Zdecydowanie odradzamy przeciw ekskluzywnej konstrukcji łukowej wszędzie tam, gdzie możliwe, z dobrego powodu, że mogą być niezręczne do pisania kodu i stwarzają większe trudności w utrzymaniu.

12. W ogóle nie wykonuję analizy wydajności na zapytaniach

Pragmatyzm panuje nad wszystkim, szczególnie w świecie baz danych. Jeśli trzymasz się zasad do tego stopnia, że stały się dogmatem, to prawdopodobnie popełniłeś błędy. Weźmy przykład zapytań zbiorczych z góry. Na wersja zbiorcza może wyglądać "ładnie", ale jej wydajność jest kiepska. Porównanie wyników powinno zakończyć debatę (ale nie wyszło), ale bardziej do rzeczy: wygłaszanie takich źle poinformowanych poglądów w pierwszej kolejności jest ignoranckie, nawet niebezpieczne.

13. Zbyt duże oparcie na wszystkich konstrukcjach Unii, a w szczególności na konstrukcjach Unii

Unia w terminach SQL tylko łączy zgodne zbiory danych, co oznacza, że mają ten sam typ i liczbę kolumn. Różnica między nimi jest taka, że Unia wszystko jest prostą konkatenacją i powinna być preferowana tam, gdzie jest to możliwe, podczas gdy Unia w sposób dorozumiany zrobi odrębny, aby usunąć duplikaty krotek.

Związki, jak odrębne, mają swoje miejsce. Istnieją ważne wnioski. Ale jeśli znajdziesz się robi wiele z nich, szczególnie w zapytaniach podrzędnych, to prawdopodobnie robisz coś złego. Może to być przypadek złej konstrukcji zapytań lub źle zaprojektowanego modelu danych zmuszającego Cię do takich działań.

Związki, szczególnie, gdy jest używany w połączeniach lub podrzędnych zapytaniach podrzędnych, może uszkodzić bazę danych. Staraj się ich unikać, gdy tylko to możliwe.

14. Użycie lub warunki w zapytaniach

To może wydawać się nieszkodliwe. W końcu Idy są OK. Czy też powinno być OK? Źle. Zasadniczo warunek AND ogranicza zbiór danych, podczas gdy warunek OR powiększa go, ale nie w sposób pozwalający na optymalizację. Szczególnie, gdy różne lub warunki mogą przeciąć w ten sposób zmuszając optymalizator do skutecznego odrębnego działania na wynik.

Zły:

... WHERE a = 2 OR a = 5 OR a = 11

Lepiej:

... WHERE a IN (2, 5, 11)

Teraz twój optymalizator SQL może skutecznie przekształcić pierwsze zapytanie w drugie. Ale może nie. Po prostu tego nie rób.

15. Nie projektując swojego modelu danych, aby nadawał się do wysokowydajnych rozwiązań

Jest to trudny punkt do oszacowania. Jest to zwykle obserwowane przez jego działanie. Jeśli znajdziesz się pisząc gnarly zapytania do stosunkowo prostych zadań lub że zapytania do znalezienia stosunkowo prostych informacji nie są skuteczne, to prawdopodobnie masz słaby model danych.

W pewnym sensie ten punkt podsumowuje wszystkie wcześniejsze, ale jest to raczej przestroga, że robienie takich rzeczy, jak optymalizacja zapytań, często odbywa się najpierw, kiedy powinno być zrobione drugie. Przede wszystkim należy upewnić się, że masz dobry model danych przed próbą optymalizacji wydajności. Jako Knuth powiedział:

Przedwczesna optymalizacja jest źródłem wszelkiego zła]}

16. Nieprawidłowe wykorzystanie transakcji baz danych

Wszystkie zmiany danych dla określonego procesu powinny być atomowe. Tj. jeśli operacja się powiedzie, robi to w pełni. Jeśli się nie powiedzie, dane pozostaną niezmienione. - Nie powinno być możliwości wprowadzenia zmian "w połowie".

Najlepiej, najprostszym sposobem, aby to osiągnąć, jest to, że cały projekt systemu powinien dążyć do obsługi wszystkich danych zmiany za pomocą pojedynczych poleceń INSERT/UPDATE/DELETE. W takim przypadku nie jest wymagana specjalna obsługa transakcji, ponieważ silnik bazy danych powinien to zrobić automatycznie.

Jeśli jednak jakiekolwiek procesy wymagają wykonania wielu instrukcji jako jednostki w celu utrzymania danych w spójnym stanie, konieczna jest odpowiednia kontrola transakcji.

  • rozpocznij transakcję przed pierwszym wyciągiem.
  • Zatwierdź transakcję po ostatniej instrukcji.
  • na dowolnym błąd, Wycofaj transakcję. I bardzo NB! Nie zapomnij pominąć / przerwać wszystkich instrukcji, które następują po błędzie.

Zaleca się również zwrócenie szczególnej uwagi na subtelności interakcji warstwy łączności z bazą danych i silnika bazy danych w tym zakresie.

17. Brak zrozumienia paradygmatu "set-based"

Język SQL podąża za określonym paradygmatem dostosowanym do określonych rodzajów problemów. Różne rozszerzenia specyficzne dla dostawców niezależnie od tego, język stara się radzić sobie z problemami, które są trywialne w językach takich jak Java, C#, Delphi itp.

Ten brak zrozumienia przejawia się na kilka sposobów.
  • niewłaściwe narzucanie zbyt dużej logiki proceduralnej lub imperatywnej na bazę danych.
  • niewłaściwe lub nadmierne używanie kursorów. Zwłaszcza, gdy wystarczyłoby jedno zapytanie.
  • niepoprawnie zakładając, że uruchamia ogień raz na rząd w multi-row aktualizacje.

Określ jasny podział odpowiedzialności i staraj się użyć odpowiedniego narzędzia do rozwiązania każdego problemu.

 1003
Author: cletus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:37

Kluczowe błędy w projektowaniu i programowaniu baz danych popełniane przez programistów

  • Egoistyczne projektowanie i wykorzystanie baz danych. programiści często traktują bazę danych jako swój osobisty trwały magazyn obiektów bez uwzględniania potrzeb innych interesariuszy w danych. Dotyczy to również architektów aplikacji. Słaba konstrukcja bazy danych i integralność danych utrudnia osobom trzecim pracę z danymi i może znacznie zwiększyć koszty cyklu życia systemu. Raportowanie i MIS wydają się być słabym kuzynem w projektowaniu aplikacji i robione tylko jako przemyślenie.

  • Nadużywanie danych denormalizowanych. nadmierne Przechowywanie denormalizowanych danych i próba utrzymania ich w aplikacji jest receptą na problemy z integralnością danych. Oszczędnie stosować denormalizację. Brak chęci dodania join do zapytania nie jest wymówką do denormalizacji.

  • Boję się pisać SQL. SQL nie jest nauką rakietową i jest całkiem dobry w robieniu to praca. Warstwy mapowania O/R są całkiem dobre w wykonywaniu 95% zapytań, które są proste i dobrze pasują do tego modelu. Czasami SQL jest najlepszym sposobem na wykonanie zadania.

  • Dogmatyczne zasady "nie przechowywanych procedur". niezależnie od tego, czy uważasz, że procedury przechowywane są złe, ten rodzaj dogmatycznej postawy nie ma miejsca w projekcie oprogramowania.

  • Nie rozumiejąc projektowania baz danych. Normalizacja to twój przyjaciel i to Nie rakieta nauka. łączenie i cardinality są dość prostymi pojęciami - jeśli jesteś zaangażowany w tworzenie aplikacji bazodanowych, naprawdę nie ma usprawiedliwienia, aby ich nie rozumieć.

 110
Author: ConcernedOfTunbridgeWells,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:02
  1. nie używanie kontroli wersji na schemacie bazy danych
  2. Praca bezpośrednio z żywą bazą danych
  3. nie czytanie i zrozumienie bardziej zaawansowanych koncepcji baz danych (indeksy, indeksy klastrowe, ograniczenia, zmaterializowane widoki, itp.)
  4. Brak testu skalowalności ... dane testowe z tylko 3 lub 4 rzędów nigdy nie dadzą ci prawdziwego obrazu prawdziwego występu na żywo
 80
Author: Rad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-07 15:33:11

Nadmierne użycie i / lub zależność od procedur składowanych.

Niektórzy programiści aplikacji postrzegają procedury składowane jako bezpośrednie rozszerzenie kodu warstwy środkowej / front-end. Wydaje się, że jest to częsta cecha wśród programistów stosów Microsoft (jestem jednym z nich, ale wyrosłem z niej) i produkuje wiele procedur składowanych, które wykonują złożoną logikę biznesową i przetwarzanie przepływu pracy. To jest o wiele lepiej zrobić gdzie indziej.

Procedury przechowywane są użyteczne tam, gdzie udowodniono, że niektóre prawdziwe czynnik techniczny wymusza ich wykorzystanie (na przykład wydajność i bezpieczeństwo), na przykład utrzymywanie agregacji / filtrowania dużych zbiorów danych "blisko danych".

Ostatnio musiałem pomóc w utrzymaniu i ulepszeniu dużej aplikacji desktopowej Delphi, z której 70% logiki biznesowej i reguł zostało zaimplementowanych w 1400 procedurach składowanych SQL Server (reszta w programach obsługi zdarzeń UI). To był koszmar, głównie ze względu na trudność wprowadzenia skutecznych testów jednostkowych do TSQL, brak enkapsulacji i ubogich narzędzi (debuggery, edytory).

Pracując w przeszłości z zespołem Java szybko przekonałem się, że często w tym środowisku panuje zupełne przeciwieństwo. Architekt Javy powiedział mi kiedyś: "baza danych służy do danych, a nie do kodu.".

W dzisiejszych czasach myślę, że błędem jest nieuwzględnianie w ogóle przechowywanych proc, ale powinny być używane oszczędnie (nie domyślnie) w sytuacjach, w których zapewniają użyteczne korzyści (patrz Pozostałe odpowiedzi).

 46
Author: Ashley Henderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-23 17:24:49

Problem Numer jeden? Testują tylko w bazach zabawek. Więc nie mają pojęcia, że ich SQL będzie się czołgać, gdy baza danych się powiększy, a ktoś musi przyjść i naprawić to później(ten dźwięk, który słychać, to zgrzytanie zębami).

 41
Author: Bob Moore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-07 15:37:54

Nie używam indeksów.

 31
Author: Christophe Herreman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-07 14:19:42

Słaba wydajność spowodowana Skorelowanymi zapytaniami podrzędnymi

Przez większość czasu chcesz uniknąć skorelowanych zapytań podrzędnych. Zapytanie podrzędne jest skorelowane, jeśli wewnątrz zapytania podrzędnego znajduje się odniesienie do kolumny z zapytania zewnętrznego. Gdy tak się stanie, zapytanie podrzędne jest wykonywane co najmniej raz dla każdego zwracanego wiersza i może być wykonywane więcej razy, jeśli zostaną zastosowane inne warunki po zastosowaniu warunku zawierającego skorelowane zapytanie podrzędne.

Wybacz wymyślony przykład i składnia Oracle, ale powiedzmy, że chciałeś znaleźć wszystkich pracowników, którzy zostali zatrudnieni w każdym z Twoich sklepów od ostatniego czasu, gdy sklep zrobił mniej niż $10,000 sprzedaży w ciągu dnia.

select e.first_name, e.last_name
from employee e
where e.start_date > 
        (select max(ds.transaction_date)
         from daily_sales ds
         where ds.store_id = e.store_id and
               ds.total < 10000)

Zapytanie podrzędne w tym przykładzie jest skorelowane z zewnętrznym zapytaniem przez store_id i będzie wykonywane dla każdego pracownika w systemie. Jednym ze sposobów optymalizacji tego zapytania jest przeniesienie zapytania podrzędnego do widoku wbudowanego.

select e.first_name, e.last_name
from employee e,
     (select ds.store_id,
             max(s.transaction_date) transaction_date
      from daily_sales ds
      where ds.total < 10000
      group by s.store_id) dsx
where e.store_id = dsx.store_id and
      e.start_date > dsx.transaction_date

W tym przykładzie zapytanie w klauzuli from jest teraz inline-view (znowu jakaś specyficzna składnia Oracle) i jest wykonywany tylko raz. W zależności od modelu danych, to zapytanie będzie prawdopodobnie wykonywane znacznie szybciej. Byłoby lepiej niż pierwsze zapytanie, ponieważ liczba pracowników wzrosła. Pierwsze zapytanie mogłoby działać lepiej, gdyby było niewielu pracowników i wiele sklepów (i być może wiele sklepów nie miało pracowników), a tabela daily_sales była indeksowana na store_id. Nie jest to prawdopodobny scenariusz, ale pokazuje, w jaki sposób skorelowane zapytanie może prawdopodobnie lepiej niż alternatywa.

Widziałem, jak młodsi Programiści korelują zapytania podrzędne wiele razy i zwykle miało to poważny wpływ na wydajność. Jednak podczas usuwania skorelowanych zapytań podrzędnych należy spojrzeć na explain plan przed i po, aby upewnić się, że nie pogarszasz wydajności.

 28
Author: adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-13 15:48:46

Z mojego doświadczenia:
Nie komunikuje się z doświadczonymi osobami DBAs.

 21
Author: Kb.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-07 14:42:55

Używanie Access zamiast "prawdziwej" bazy danych. Istnieje wiele wielkich małych, a nawet darmowych baz danych, takich jak SQL Express, MySQL i SQLite, które będą działać i skalować znacznie lepiej. Aplikacje często muszą skalować się w nieoczekiwany sposób.

 17
Author: Nathan Voxland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-08 04:20:43

Zapominanie o ustawianiu relacji między tabelami. Pamiętam, że musiałem to posprzątać, kiedy po raz pierwszy zacząłem pracować u mojego obecnego pracodawcy.

 16
Author: TheTXI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-07 14:16:30

Używanie Excela do przechowywania (ogromnych ilości) danych.

Widziałem firmy posiadające tysiące wierszy i używające wielu arkuszy roboczych (ze względu na limit wierszy 65535 w poprzednich wersjach programu Excel).


Excel dobrze nadaje się do raportów, prezentacji danych i innych zadań, ale nie powinien być traktowany jako baza danych.

 14
Author: ML--,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-02 17:18:26

Chciałbym dodać: Faworyzowanie "eleganckiego" kodu nad wysoce wydajnym kodem. Kod, który najlepiej działa na bazach danych, jest często brzydki dla oka twórcy aplikacji.

Wierząc, że bzdury o przedwczesnej optymalizacji. Bazy danych muszą uwzględniać wydajność w oryginalnym projekcie i w każdym późniejszym rozwoju. Wydajność to 50% projektu bazy danych (40% to integralność danych, a ostatnie 10% to bezpieczeństwo). Bazy danych, które nie są budowane od dołu do góry w celu wykonania będzie działać źle, gdy prawdziwi użytkownicy i prawdziwy ruch zostaną umieszczeni w bazie danych. Przedwczesna optymalizacja nie oznacza braku optymalizacji! Nie oznacza to, że powinieneś pisać kod, który prawie zawsze będzie działał źle, ponieważ znajdziesz go łatwiej (na przykład Kursory, które nigdy nie powinny być dozwolone w produkcyjnej bazie danych, chyba że wszystkie inne zawiodły). Oznacza to, że nie musisz patrzeć na wyciskanie tego ostatniego kawałka wydajności, dopóki nie będziesz musiał. Wiele wiadomo o tym, co sprawdzi się lepiej na bazy danych, ignorowanie tego w projektowaniu i rozwoju jest w najlepszym razie krótkowzroczne.

 14
Author: HLGEM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-23 17:28:20

Nie używa parametryzowanych zapytań. Są bardzo przydatne w zatrzymywaniu SQL Injection.

Jest to szczególny przykład nie dezynfekcji danych wejściowych, wspomniany w innej odpowiedzi.

 13
Author: Ash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-07 16:52:46

Nienawidzę, gdy programiści używają zagnieżdżonych instrukcji select lub nawet funkcji, które zwracają wynik instrukcji select wewnątrz części "SELECT" zapytania.

Dziwi mnie, że nie widzę tego nigdzie indziej, być może przeoczyłem, chociaż @adam ma podobny problem.

Przykład:

SELECT
    (SELECT TOP 1 SomeValue FROM SomeTable WHERE SomeDate = c.Date ORDER BY SomeValue desc) As FirstVal
    ,(SELECT OtherValue FROM SomeOtherTable WHERE SomeOtherCriteria = c.Criteria) As SecondVal
FROM
    MyTable c

W tym scenariuszu, jeśli MyTable zwraca 10000 wierszy, wynik jest tak, jakby zapytanie uruchomiło 20001 zapytań, ponieważ musiało uruchomić początkowe zapytanie plus zapytanie każda z pozostałych tabel raz dla każdej linii wyniku.

Programiści mogą się z tego wywinąć pracując w środowisku deweloperskim, gdzie zwracają tylko kilka wierszy danych, a tabele podrzędne zwykle mają tylko niewielką ilość danych, ale w środowisku produkcyjnym tego rodzaju zapytania mogą stać się wykładniczo kosztowne, ponieważ więcej danych jest dodawanych do tabel.

Lepszym (niekoniecznie idealnym) przykładem może być coś w stylu:

SELECT
     s.SomeValue As FirstVal
    ,o.OtherValue As SecondVal
FROM
    MyTable c
    LEFT JOIN (
        SELECT SomeDate, MAX(SomeValue) as SomeValue
        FROM SomeTable 
        GROUP BY SomeDate
     ) s ON c.Date = s.SomeDate
    LEFT JOIN SomeOtherTable o ON c.Criteria = o.SomeOtherCriteria

Pozwala to na optymalizację bazy danych aby przetasować dane razem, zamiast requery na każdym rekordzie z tabeli głównej i zwykle znajduję, gdy muszę naprawić Kod, gdzie ten problem został utworzony, zwykle kończy się zwiększenie prędkości zapytań o 100% lub więcej, jednocześnie zmniejszając zużycie procesora i pamięci.

 12
Author: CStroliaDavis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-23 16:25:31

Dla baz danych opartych na SQL:

  1. Brak korzystania z klastrowych indeksów lub wybór niewłaściwych kolumn do klastra.
  2. nieużywanie typu danych szeregowych (autonumber) jako klucza podstawowego do połączenia z kluczem obcym (INT) w relacji tabeli rodzic/potomek.
  3. nie aktualizowanie statystyk w tabeli, gdy wiele rekordów zostało wstawionych lub usuniętych.
  4. nie reorganizowanie (tj. rozładowywanie, upuszczanie, ponowne tworzenie, ładowanie i ponowne indeksowanie) tabel po wstawieniu wielu wierszy lub usunięte (niektóre silniki fizycznie przechowują usunięte wiersze w tabeli z flagą delete.)
  5. nie Korzystanie z FRAGMENT w wyrażeniu (jeśli jest obsługiwane) na dużych tabelach, które mają wysokie stawki transakcji.
  6. wybór niewłaściwego typu danych dla kolumny!
  7. nie wybiera odpowiedniej nazwy kolumny.
  8. nie dodawanie nowych kolumn na końcu tabeli.
  9. Nie tworzenie odpowiednich indeksów do obsługi często używanych zapytań.
  10. tworzenie indeksów na kolumnach z kilkoma możliwymi wartości i tworzenie niepotrzebnych indeksów.
    ...więcej do dodania.
 12
Author: Frank Computer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-14 02:00:21
  • Nie robienie kopii zapasowej przed naprawieniem jakiegoś problemu w bazie danych produkcji.

  • Używanie poleceń DDL na przechowywanych obiektach (takich jak tabele, widoki) w procedurach przechowywanych.

  • Strach przed używaniem przechowywanego proc lub strach przed używaniem zapytań ORM wszędzie tam, gdzie ten jest bardziej wydajny/odpowiedni do użycia.

  • Ignorując korzystanie z profilera bazy danych, który może powiedzieć dokładnie, na co zapytanie ORM jest konwertowane w końcu, a tym samym zweryfikować logikę lub nawet dla debugowanie, gdy nie używasz ORM.

 9
Author: WhoIsNinja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-24 18:37:52

Nie wykonuje prawidłowego poziomu normalizacji . Chcesz się upewnić,że dane nie są zduplikowane i że w razie potrzeby dzielisz dane na różne. Musisz również upewnić się, że nie przestrzegasz normalizacji zbyt o ile to zaszkodzi wydajności.

 8
Author: Nathan Voxland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-07 14:22:35

Traktowanie bazy danych jako tylko mechanizmu przechowywania (tj. biblioteki zbiorów), a co za tym idzie podporządkowanie jej aplikacji (ignorowanie innych aplikacji współdzielących DANE)

 8
Author: finnw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-07 16:02:56
  • odrzucenie ORM jak Hibernate, z powodów takich jak "It' s too magical" lub "not on my database".
  • poleganie zbyt mocno na ORM jak Hibernate i próba obkucia go tam, gdzie nie jest to właściwe.
 8
Author: Adam Jaskiewicz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-02 18:33:48

1 - niepotrzebnie używanie funkcji na wartości w klauzuli where z wynikiem nieużywania tego indeksu.

Przykład:

where to_char(someDate,'YYYYMMDD') between :fromDate and :toDate

Zamiast

where someDate >= to_date(:fromDate,'YYYYMMDD') and someDate < to_date(:toDate,'YYYYMMDD')+1

I w mniejszym stopniu: nie dodawanie indeksów funkcyjnych do tych wartości, które ich potrzebują...

2 - nie dodawanie ograniczeń kontroli w celu zapewnienia ważności danych. Ograniczenia mogą być używane przez optymalizator zapytań i naprawdę pomagają zapewnić, że możesz ufać swoim niezmiennikom. Jest nie ma powodu, żeby ich nie używać.

3 - Dodawanie nieznormalizowanych kolumn do tabel z czystego lenistwa lub presji czasu. Rzeczy zazwyczaj nie są zaprojektowane w ten sposób, ale ewoluują w ten sposób. Rezultatem jest mnóstwo pracy, która stara się posprzątać bałagan, gdy zostaniesz ugryziony przez utraconą integralność danych w przyszłych ewolucjach.

Pomyśl o tym, tabela bez danych jest bardzo tania do przeprojektowania. Stół z kilkoma milionami rekordów bez uczciwości... nie tak tanio do przeprojektować. Tak więc wykonanie poprawnego projektu podczas tworzenia kolumny lub tabeli jest amortyzowane w pikach.

4 - nie tyle o bazie danych per se, ale rzeczywiście irytujące. Nie dbając o jakość kodu SQL. Fakt, że Twój SQL jest wyrażony w tekście nie sprawia, że w porządku jest ukrywanie logiki w stertach algorytmów manipulacji ciągiem. Jest to całkowicie możliwe, aby napisać SQL w tekście w sposób, który jest rzeczywiście czytelny przez kolegę programisty.

 8
Author: John Nilsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-04 11:05:17

To już zostało powiedziane, ale: indeksy, indeksy, indeksy . Widziałem tak wiele przypadków źle działających aplikacji internetowych dla przedsiębiorstw, które zostały naprawione przez zwykłe profilowanie (aby zobaczyć, które tabele były często trafiane), a następnie dodanie indeksu na tych tabelach. To nie wymaga nawet wiele w sposobie pisania SQL wiedzy, a wypłata jest ogromna.

Unikaj powielania danych jak plaga. Niektórzy opowiadają się za tym, że małe powielanie nie zaszkodzi i będzie popraw wydajność. Hej, nie mówię, że musisz torturować swój schemat do trzeciej normalnej formy, dopóki nie będzie tak abstrakcyjny, że nawet DBA nie wie, co się dzieje. Po prostu zrozum, że za każdym razem, gdy zduplikujesz zestaw nazw, kodów pocztowych lub kodów wysyłkowych, kopie wypadną ze sobą w końcu. To się stanie. A potem będziesz się kopać, uruchamiając cotygodniowy skrypt konserwacji.

I na koniec: użyj jasnego, spójnego, intuicyjnego nazewnictwa zjazd. W ten sam sposób, w jaki dobrze napisany fragment kodu powinien być czytelny, dobry schemat SQL lub zapytanie powinno być czytelne i praktycznie powiedzieć co robi, nawet bez komentarzy. Podziękujesz sobie za pół roku, kiedy będziesz musiał utrzymać się na stołach. "SELECT account_number, billing_date FROM national_accounts" jest nieskończenie łatwiejsze w obsłudze niż "SELECT ACCNTNBR, BILLDAT FROM NTNLACCTS".

 7
Author: pbailey19,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-28 20:23:27

Nie wykonywanie odpowiedniego zapytania SELECT przed uruchomieniem zapytania DELETE (szczególnie w bazach produkcyjnych)!

 6
Author: Jamol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-06 12:11:37

Najczęstszy błąd, jaki widziałem od dwudziestu lat: nie planowanie z wyprzedzeniem. Wielu programistów tworzy bazę danych i tabele, a następnie stale modyfikuje i rozszerza tabele podczas tworzenia aplikacji. Efekt końcowy jest często bałagan i nieefektywne i trudne do czyszczenia lub uprościć później.

 5
Author: Skatterbrainz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-29 03:56:14

A) twarde wartości zapytania w łańcuchu
b) umieszczenie kodu zapytania bazy danych w akcji "OnButtonPress" w aplikacji Windows Forms

Widziałem oba.

 4
Author: Benoit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-23 17:29:57

Nie zwracanie wystarczającej uwagi na zarządzanie połączeniami baz danych w aplikacji. Następnie dowiadujesz się, że aplikacja, komputer, serwer i sieć są zatkane.

 4
Author: chefsmart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-23 17:32:34
  1. Myśląc, że są DBAs i data modelers / designers, gdy nie mają formalnej indoktrynacji jakiegokolwiek rodzaju w tych obszarach.

  2. Myślenie, że ich projekt nie wymaga DBA, ponieważ to wszystko jest łatwe/trywialne.

  3. Brak prawidłowego rozróżnienia między pracą, która powinna być wykonana w bazie danych, a pracą, która powinna być wykonana w aplikacji.

  4. Nie sprawdzanie kopii zapasowych lub nie tworzenie kopii zapasowych.

  5. Osadzanie surowego SQL w ich kod.

 4
Author: jonesy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-05 13:55:11
 3
Author: Charles Faiga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-07 17:07:29

Brak zrozumienia modelu współbieżności baz danych i tego, jak wpływa to na rozwój. Łatwo jest dodawać indeksy i poprawiać zapytania po fakcie. Jednak aplikacje zaprojektowane bez należytego uwzględnienia hotspotów, zasobów i poprawne działanie (zakładając, że to co właśnie przeczytałeś jest nadal aktualne!) może wymagać znaczących zmian w warstwie bazy danych i aplikacji, aby później je skorygować.

 3
Author: Einstein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-23 17:33:10

Nie rozumiejąc, jak DBMS działa pod maską.

Nie można prawidłowo prowadzić drążka bez zrozumienia, jak działa sprzęgło. I nie możesz zrozumieć, jak korzystać z bazy danych bez zrozumienia, że tak naprawdę piszesz do pliku na dysku twardym.

Konkretnie:

  1. Wiesz, co to jest indeks klastrowy? Pomyślałeś o tym, kiedy projektowałeś swój schemat?

  2. Czy wiesz jak prawidłowo używać indeksów? Jak aby ponownie wykorzystać indeks? Wiesz, co to jest indeks przykrywający?

  3. Świetnie, masz indeksy. Jak duży jest 1 wiersz w indeksie? Jak duży będzie indeks, gdy masz dużo danych? Czy to łatwo wpasuje się w pamięć? Jeśli nie będzie to bezużyteczne jako indeks.

  4. Używałeś kiedyś EXPLAIN w MySQL? Świetnie. Teraz bądź szczery ze sobą: czy zrozumiałeś chociaż połowę tego, co widziałeś? Napraw to.

  5. Rozumiesz Bufor zapytań? Czy wiesz, co sprawia, że zapytanie jest nieosiągalne?

  6. Używasz MyISAM? Jeśli potrzebujesz pełnotekstowego wyszukiwania, MyISAM i tak jest do dupy. Użyj Sphinx. Następnie przełącz na Inno.

 3
Author: Shane H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-13 15:42:34
  1. Używanie ORM do masowych aktualizacji
  2. Wybór większej ilości danych niż potrzeba. Ponownie, zwykle robi się to przy użyciu ORM
  3. odpalanie SQL w pętli.
  4. brak dobrych danych testowych i zauważenie pogorszenia wydajności tylko na danych na żywo.
 3
Author: Sriram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-13 17:36:29