Dobra specyfikacja bazy danych pomaga zmniejszyć złożoność implementacji oprogramowania i obniżyć koszty komunikacji.
1. Żelazna zasada budowy magazynu
- | Prawo żelaza | Poziom | uwaga | Zestaw znaków | Użyj UTF-8. Jeśli emoji jest przechowywane, użyj utf8mb4 do przechowywania. | Zmuszony |
| | Zasady sortowania | Użyj utf8_general_ci | Zmuszony | |
2. Żelazne prawo konstrukcji stołu
- | Prawo żelaza | Poziom | uwaga | egzegeza | Pamiętaj, aby mieć adnotacje polowe. | Zmuszony |
| | kodować | Użyj UTF-8. Jeśli emoji jest przechowywane, użyj utf8mb4 do przechowywania. | Zmuszony |
| | Czy dziedzina jest koncepcyjna | Musi być nazwany is_xx, a typ danych to nieznakomity tinyint(1 yes, 0 no), np. is_deleted(1 delete, 0 not deleted). | Zmuszony | Każde pole musi być nieoznaczone, jeśli nie jest ujemne | Nazwa tabeli, nazwa pola | Można używać tylko małych liter, podkreśleń lub cyfr; Nie wolno zaczynać od podkreślenia lub cyfry; Tylko liczby są zabronione między dwoma podkreśleniami; Wyłącz słowa zarezerwowane; Używanie rzeczowników w liczbie mnogiej jest zabronione w nazwach tabel. | Zmuszony |
| | Nazwanie nazwy bazy danych i nazwy tabeli | Nazwa bazy danych powinna być zgodna z nazwą aplikacji, a nazwa tabeli powinna być nazwana jako Business Name_Role tabeli. | Zmuszony |
| | Nazewnictwo indeksu | Indeks klucza podstawowego używa pk_ nazwy pola; Unikalny indeks z uk_ nazwą pola; Indeksy normalne używają idx_ nazw pól. | Zmuszony | pk_ jest tonacją podstawową; uk_ jest kluczem unikalnym; idx_ to indeks | Typ dziesiętny | Typ danych jest przesiętny, a stosowanie float i double jest zabronione, float i double mają utratę precyzji, a jeśli zakres przechowywanych danych przekracza zakres dziesiętny, zaleca się podzielenie danych na liczby całkowite i dziesiętne oraz ich osobne przechowywanie. | Zmuszony |
| | Typ varchar | varchar to zmiennie długi ciąg znaków, nie przydziela się wcześniej miejsca na przechowywanie, długość nie powinna przekraczać 5000 znaków, jeśli długość przekracza 5000, należy zastosować tekst (utworzyć osobną tabelę, użyć klucza głównego do korespondencji, aby uniknąć wpływu na efektywność indeksowania innych pól). | Zmuszony |
| | W nazwie tabeli muszą być trzy pola | ID (typ danych to bezznakowy bigint, pojedynczy przyrost tabeli, rozmiar kroku to 1), gmt_create, gmt_modified (aktywny czas tworzenia, pasywny czas aktualizacji, typ danych to datetime). | Zmuszony |
| | Redundancja polowa | Pola pozwalają na odpowiednią redundancję, ale należy brać pod uwagę spójność danych, a pola redundantne powinny mieć 1) rzadkie modyfikacje; 2) To nie jest bardzo długie pole varchar, nie mówiąc już o polu tekstowym. | Rekomenduj |
| | Podziel bazę danych i tabele | Partycjonowanie jest zalecane tylko wtedy, gdy liczba wierszy w jednej tabeli przekracza 5 milionów wierszy lub pojemność jednej tabeli przekracza 2 GB. | Rekomenduj | |
Ustawienie odpowiedniej długości pamięci znaków nie tylko oszczędza miejsce w tabelach bazy danych i indeksach, ale co ważniejsze, poprawia szybkość wyszukiwania.
3. Ustalenie indeksowego prawa żelaza
- | Prawo żelaza | Poziom | uwaga | Unikalny indeks | Pola o unikalnych cechach w biznesie, nawet jeśli są kombinacją pól, muszą być unikalnie indeksowane. Chociaż unikalny indeks wpływa na szybkość insertu, ta strata jest pomijalna, ale znacząco poprawia szybkość zapytań. Dodatkowo, nawet jeśli warstwa aplikacyjna ma bardzo pełną kontrolę kontrolną, o ile nie ma unikalnego indeksu, zgodnie z prawem Murphy'ego, nieuchronnie generowane będą brudne dane. | Zmuszony |
| | dołącz | Więcej niż trzy tabele zabraniają łączenia pól, które wymagają łączenia i muszą być spójne; Gdy wiele tabel jest powiązanych z zapytaniami, upewnij się, że powiązane pola muszą mieć indeks. Nawet jeśli masz połączenie podwójnych tabel, zwracaj uwagę na indeksowanie tabel, wydajność SQL. | Zmuszony |
| | Varcharfield | Długość indeksu musi być określona i nie ma potrzeby indeksowania wszystkich pól, wystarczy określić długość indeksu zgodnie z rzeczywistym rozróżnieniem tekstu. Długość indeksu i rozróżnienie to para sprzeczności, zazwyczaj dla danych typu ciągu indeksy o długości 20 mają stopień rozróżnienia powyżej 90%, który można określić na podstawie stopnia rozróżnienia (wyraźny lewy (nazwa kolumny, długość indeksu))/liczenia(*). | Zmuszony |
| | Rozmycie jest zabronione podczas wyszukiwania stron | Wyszukiwanie stron zabrania rozmycia lub pełnego rozmycia, jeśli jest to konieczne, prosimy o wejście do wyszukiwarki, aby to rozwiązać. Powód zakazu: Plik indeksu ma właściwość dopasowania prefiksu po lewej stronie drzewa B, a jeśli wartość po lewej nie jest określona, ten indeks nie może być użyty. | Zmuszony |
| | kolejność według | Jeśli jest kolejność według scenariusza, zwróć uwagę na uporządkowanie indeksu. Ostatnie pole kolejności przez jest częścią indeksu łączonego i umieszcza się na końcu kolejności kombinacji indeksów, aby uniknąć file_sort i wpłynąć na wydajność zapytań. Przykład: gdzie a=? i b=? kolejność według c; Indeks powinien być zbudowany jako a_b_c; Kontrprzykład: Jeśli w indeksie jest wyszukiwanie zakresu, to uporządkowanie indeksu nie może być wykorzystane, na przykład gdy a>10 jest w porządku b; Indeks a_b nie może być sortowany. | Rekomenduj | |
4. Napisz żelazne reguły SQL
- | Prawo żelaza | Poziom | uwaga | count(*) | Nie używaj count(nazwa kolumny) ani count(constant) zamiast count(*), która jest składnią standardowej liczby wierszy zdefiniowanej przez SQL92, niezależną od bazy danych i niezależną od NULL oraz non-NULL. count(*) liczy wiersze o wartości NULL, natomiast count(nazwa kolumny) nie liczy wierszy z tą kolumną NULL. | Zmuszony |
| | Hrabia (wyraźny col) | Liczy liczbę unikalnych wierszy w kolumnie z wyjątkiem NULL. Zwróć uwagę, że count(różny col1, col2), jeśli jedna z kolumn jest NULL, zwraca 0, nawet jeśli druga kolumna ma inną wartość. | Zmuszony |
| | sum(col) | Gdy wartości kolumny są wszystkie NULL, count(col) zwraca 0, ale sum(col) zwraca NULL, więc musisz być świadomy problemów z NPE przy użyciu sum(). Problemy NPE można uniknąć w następujący sposób: wybierz jeśli(isnull(sum(g)), 0, sum(g)) z tabeli; | Zmuszony |
| | isnull | Użyj isnull(), aby określić, czy jest to wartość NULL. NULL to NULL w porównaniu do dowolnej wartości. | Zmuszony |
| | Logika zapytań paginacji | Jeśli liczba wynosi 0, należy ją zwrócić bezpośrednio, aby uniknąć wykonania kolejnego zapowiedzenia paginacji. | Zmuszony |
| | Zewnętrzne klucze i kaskady | Używanie kluczy obcych i kaskadowanie jest zabronione, a wszystkie koncepcje kluczy obcych muszą być rozwiązane na warstwie aplikacji. Powód: Obce klucze i kaskady nie nadają się do rozproszonych klastrów o wysokiej równobieżności, kaskadowe aktualizacje silnie blokują, istnieje ryzyko burz aktualizacji bazy danych, a klucze obce wpływają na szybkość wstawiania bazy danych. | Zmuszony |
| | Procedury przechowywane | Procedury przechowywane są zabronione, a procedury przechowywane trudne do debugowania i skalowania, a także nie są przenośne. | Zmuszony |
| | Korygowanie danych | Podczas poprawiania danych (szczególnie usuwania lub modyfikowania rekordów) wybierz najpierw tak, aby uniknąć przypadkowego usunięcia, i wykonaj polecenie update dopiero po potwierdzeniu jego poprawności. | Zmuszony |
| | w | Jeśli nie da się tego uniknąć, liczba elementów po wciągnięciu powinna być kontrolowana w granicach 1000. | Rekomenduj |
| | Tablica obcinania | Zakazuje się używania tablicy truncate, która jest szybsza niż delete i zużywa mniej zasobów systemowych i logowych, ale truncate jest wolna od transakcji i nie wywołuje wyzwalaczy, które mogą powodować awarie, dlatego nie używaj tego polecenia w kodzie deweloperskim. | odniesienie |
|
5. Mapy żelaza ORM
| - | Prawo żelaza | Poziom | uwaga | Zapytanie do tabeli | Lista pól, których używanie * do zapytań jest zabronione, musi być jasna, które pola są wymagane. | Zmuszony |
| | POJO | Atrybut Boole'a klasy POJO nie może być dodawany do is, natomiast pole bazy danych musi być dodane do is, co wymaga mapowania między polami i atrybutami w resultMap. | Zmuszony |
| | Parametry zwrotu | Zabronione jest używanie resultClass jako parametru zwrotu, nawet jeśli wszystkie nazwy atrybutów klas odpowiadają polom bazowym pojedynczo, muszą być definiowane; Każda tabela musi mieć odpowiedni atrybut. Powód: Konfiguruj relację mapowania, aby połączyła pole z klasą DO dla łatwej konserwacji. | Zmuszony |
| | Parametry zwrotu | Zabronione jest bezpośrednie używanie HashMap i HashTable jako wyjścia zbioru wyników zapytań. Powód: Typ wartości atrybutu jest nie do kontrolowania. | Zmuszony |
| | sql.xml Konfiguruj parametry | sql.xml Używaj #{}, #param# do parametrów konfiguracyjnych i nie używaj ${}, ponieważ ${} jest podatny na wstrzykiwanie SQL. | Zmuszony |
| | queryForList | Używanie queryForList (String statementName, int start, int size) dołączonego do Mybatis jest zabronione. Powód: Jest realizowany poprzez pobranie wszystkich rekordów instrukcji SQL odpowiadających statementName w bazie danych, a następnie użycie podlisty do uzyskania podzbioru rozmiaru start, . | Zmuszony |
| | Czas aktualizacji | Podczas aktualizacji rekordu tabeli bazy danych należy jednocześnie zaktualizować czas modyfikacji rekordu. | Zmuszony |
| | Zaktualizuj rekordy tabel bazy danych | Nie pisz dużego i pełnego interfejsu aktualizacji danych (przekazanego jako klasa POJO). Podczas wykonywania SQL nie aktualizuj niezmienionych pól ze względu na podatne na błędy, nieefektywność i zwiększone miejsce przechowywania binlogów. | Rekomenduj |
| | @Transactional | @Transactional Nie nadużywaj transakcji. Transakcje wpływają na QPS bazy danych. Dodatkowo, gdy używasz transakcji, musisz brać pod uwagę różne aspekty schematów rollback, w tym cofnięcie pamięci podręcznej, rollback w wyszukiwarkach, kompensację wiadomości, korektę statystyczną itd. | odniesienie |
| | Mybatis dynamic sql tags | < compareValue w isEqual> jest stałą względem wartości atrybutu, zwykle liczbą, co oznacza, że odpowiadające polecenie SQL jest wykonywane przy równości; < isNotEmpty> oznacza, że jest wykonywany, gdy nie jest empty i nie jest null; < isNotNull> oznacza, że jest wykonywany, gdy nie jest null. | odniesienie | |
|