Dobrá specifikace databáze pomáhá snížit složitost softwarové implementace a snížit náklady na komunikaci.
1. Železný zákon při stavbě skladu
- | Železný zákon | Úroveň | poznámka | Sada znaků | Použijte UTF-8. Pokud je emoji uložený, použijte utf8mb4 pro uložení. | Nucený |
| | Pravidla třídění | Použijte utf8_general_ci | Nucený | |
2. Železný zákon konstrukce stolů
- | Železný zákon | Úroveň | poznámka | exegeze | Nezapomeňte mít terénní poznámky. | Nucený |
| | zakódovat | Použijte UTF-8. Pokud je emoji uložený, použijte utf8mb4 pro uložení. | Nucený |
| | zda je obor konceptuální | Musí být pojmenován is_xx a datový typ je nepodepsaný tinyint(1 ano, 0 ne), např. is_deleted(1 smazat, 0 nesmazáno). | Nucený | Každé pole musí být bez znaménka, pokud není záporné | Název tabulky, název pole | Lze použít pouze malá písmena, podtržítka nebo čísla; Je zakázáno začínat podtržením nebo číslem; Pouze čísla jsou zakázána mezi dvěma podtržítky; Vypnout vyhrazená slova; Používání množných podstatných jmen je v názvech tabulek zakázáno. | Nucený |
| | Pojmenování názvu databáze a názvu tabulky | Název databáze by měl být konzistentní s názvem aplikace a název tabulky by měl být pojmenován jako Business Name_Role tabulky. | Nucený |
| | Pojmenování indexu | Primární klíčový index používá pk_ název pole; Unikátní index s uk_ názvem pole; Normální indexy používají idx_ názvy polí. | Nucený | pk_ je hlavní tónina; uk_ je jedinečný klíč; idx_ je index | Desetinný typ | Typ dat je desetinný a použití float a double je zakázáno, float a double mají ztrátu přesnosti, a pokud uložený rozsah dat přesahuje rozsah desetinných čísel, doporučuje se data rozdělit na celá a desetinná čísla a uložit je samostatně. | Nucený |
| | Varchar typ | varchar je proměnný dlouhý řetězec, předem není vyhrazeno žádné místo pro uložení, délka by neměla přesáhnout 5000 znaků, pokud je délka větší než 5000, použijte text (vytvořte samostatnou tabulku, použijte primární klíč k odpovídání, aby se zabránilo ovlivnění efektivity indexování jiných polí). | Nucený |
| | V názvu tabulky musí být tři pole | ID (datový typ je neposigned bigint, přírůstek jedné tabulky, velikost kroku 1), gmt_create, gmt_modified (aktivní čas vytvoření, pasivní aktualizace, datový typ je datetime). | Nucený |
| | Záloha v terénu | Pole umožňují odpovídající redundanci, ale je třeba zohlednit konzistenci dat a redundantní pole by měla mít 1) vzácné úpravy; 2) Ne varcharovo super dlouhé pole, natož textové pole. | doporučovat |
| | Rozdělte databázi a tabulky | Rozdělení na části se doporučuje pouze tehdy, když počet řádků v jedné tabulce přesahuje 5 milionů řádků nebo kapacita jedné tabulky přesahuje 2 GB. | doporučovat | |
Nastavení správné délky paměti znaků nejen šetří místo v databázových tabulkách a indexech, ale co je důležitější, zlepšuje rychlost vyhledávání.
3. Stanovte indexový železný zákon
- | Železný zákon | Úroveň | poznámka | Unikátní index | Pole s jedinečnými charakteristikami v podnikání, i když jsou kombinací polí, musí být jednoznačně indexována. Ačkoli jedinečný index ovlivňuje rychlost vložení, tato ztráta je zanedbatelná, ale výrazně zlepšuje rychlost dotazů. Navíc, i když má aplikační vrstva velmi kompletní kontrolu kontrol, pokud podle Murphyho zákona neexistuje unikátní index, nevyhnutelně budou generována špinavá data. | Nucený |
| | join | Více než tři tabulky zakazují spojování, pole vyžadují spojení a datové typy musí být konzistentní; Pokud je k dotazům přiřazeno více tabulek, ujistěte se, že příslušná pole musí mít index. I když máte dvojité tabulkové spojení, věnujte pozornost indexování tabulek a výkonu SQL. | Nucený |
| | Varcharfield | Délka indexu musí být specifikována a není třeba indexovat všechna pole, stačí určit délku indexu podle skutečného rozlišení textu. Délka indexu a rozlišení jsou dvojice rozporů, obecně u dat typu řetězce mají indexy s délkou 20 stupeň rozlišení více než 90 %, což lze určit rozlišením počtu (odlišný levý (název sloupce, délka indexu))/početí(*). | Nucený |
| | Rozmazání je při vyhledávání na stránce zakázáno | Vyhledávání na stránce zakazuje rozmazání nebo úplné rozmazání, pokud je to nutné, navštivte vyhledávač, abyste to vyřešili. Důvod zákazu: Indexový soubor má vlastnost shody nejlevější předpony B-stromu, a pokud není určena hodnota vlevo, tento index nelze použít. | Nucený |
| | pořadí podle | Pokud je pořadí podle scénáře, věnujte pozornost uspořádanosti indexu. Poslední pole pořadí podle je součástí kombinovaného indexu a je umístěno na konec pořadí kombinací indexů, aby se předešlo file_sort a ovlivnilo výkon dotazu. Příklad: kde a=? a b=? pořadí podle c; Index by měl být sestaven jako a_b_c; Protipříklad: Pokud je v indexu vyhledávání v rozsahu, nelze indexovou uspořádanost využít, například kde a>10 je pořadeno podle b; Indexové a_b nelze seřadit. | doporučovat | |
4. Napište SQL železná pravidla
- | Železný zákon | Úroveň | poznámka | count(*) | Nepoužívejte count(název sloupce) nebo count(constant) místo count(*), což je syntaxe pro standardní počet řádků definovaný SQL92, nezávislou na databázi a nezávislou na NULL a non-NULL. count(*) počítá řádky s hodnotou NULL, zatímco count(název sloupce) nepočítá řádky s tímto sloupcem NULL. | Nucený |
| | Hrabě(distinct col) | Počítá počet unikátních řádků ve sloupci kromě NULL. Všimněte si, že count(odlišný sloupec1, sloupec2), pokud je jeden ze sloupců celý NULL, vrátí 0, i když druhý sloupec má jinou hodnotu. | Nucený |
| | sum(col) | Když jsou hodnoty sloupce všechny NULL, count(col) vrátí 0, ale sum(col) vrátí NULL, takže je třeba být při použití sum() opatrný s NPE problémy. NPE problémy lze vyhnout následujícími způsoby: vyberte if(isnull(sum(g)), 0, sum(g)) z tabulky; | Nucený |
| | isnull | Použijte isnull() k určení, zda je to hodnota NULL. NULL je NULL ve srovnání s jakoukoli hodnotou. | Nucený |
| | Logika stránkování dotazů | Pokud je počet 0, měl by být vrácen přímo, aby se předešlo vykonání následného příkazu stránkování. | Nucený |
| | Vnější klíče a kaskády | Používání cizích klíčů a kaskádování je zakázáno a všechny koncepty cizích klíčů musí být vyřešeny na aplikační vrstvě. Důvod: Cizí klíče a kaskády nejsou vhodné pro distribuované clustery s vysokou souběžností, kaskádové aktualizace jsou silným blokováním, hrozí riziko bouří v databázi a cizí klíče ovlivňují rychlost vkládání databáze. | Nucený |
| | Uložené procedury | Uložené procedury jsou zakázány, uložené procedury se obtížně ladí a škálují a nejsou přenosné. | Nucený |
| | Korekce dat | Při opravě dat (zejména mazání nebo úpravě záznamů) nejprve vyberte tak, abyste předešli nechtěnému mazání, a příkaz update sprovedte až po potvrzení, že je správný. | Nucený |
| | v | Pokud se tomu nelze vyhnout, měl by být počet prvků po vstupu kontrolován do 1000. | doporučovat |
| | Tabulka zkrácení | Je zakázáno používat tabulku zkrácení, která je rychlejší než mazání a spotřebovává méně systémových a logovacích zdrojů, ale zkracování je bez transakcí a nespouští spouštěče, které by mohly způsobit nehody, proto tento příkaz v kódu vývoje nepoužívajte. | odkaz |
|
5. ORM mapuje železné zákony
| - | Železný zákon | Úroveň | poznámka | Dotaz na tabulku | Seznam polí, která jsou pro dotazy zakázána používat * pro dotazy, musí být jasný, která pole jsou povinná. | Nucený |
| | POJO | Booleovský atribut třídy POJO nelze přidat k is, zatímco pole databáze musí být přidáno k is, což vyžaduje mapování mezi poli a atributy ve resultMap. | Nucený |
| | Parametry návratu | Je zakázáno používat resultClass jako návratový parametr, i když všechny názvy atributů tříd odpovídají databázovým polům jednotlivě, musí být definovány; Každá tabulka musí mít atribut, který jí odpovídá. Důvod: Nastavte mapovací vztah tak, aby pole bylo spojeno s třídou DO pro snadnou údržbu. | Nucený |
| | Parametry návratu | Je zakázáno přímo používat HashMap a HashTable jako výstup z výsledkové sady dotazů. Důvod: Typ hodnoty atributu je nekontrolovatelný. | Nucený |
| | sql.xml Nastavit parametry | sql.xml Pro konfigurační parametry použijte #{}, #param# a nepoužívejte ${}, protože ${} je náchylný k SQL injekci. | Nucený |
| | queryForList | Použití queryForList (String statementName, int start, int size), které je součástí Mybatis, je zakázáno. Důvod: Implementuje se tak, že se v databázi získávají všechny záznamy SQL příkazu odpovídajícího názvu a poté se pomocí podseznamu získá podmnožina velikosti start. | Nucený |
| | Čas aktualizace | Při aktualizaci záznamu databázové tabulky musíte současně aktualizovat čas úpravy záznamu. | Nucený |
| | Aktualizujte záznamy databázových tabulek | Nepište velké a kompletní rozhraní pro aktualizaci dat (předáno jako třída POJO). Při spouštění SQL neaktualizujte nezměněná pole kvůli chybovým, neefektivním a zvýšeným binlogovým úložištím. | doporučovat |
| | @Transactional | @Transactional Nezneužívajte transakce. Transakce ovlivňují QPS databáze. Kromě toho, kde používáte transakce, musíte zohlednit různé aspekty rollback schémat, včetně cache rollback, rollback ve vyhledávačích, kompenzace zpráv, statistické korekce atd. | odkaz |
| | Mybatis dynamic sql tags | < compareValue v isEqual> je konstanta oproti hodnotě atributu, obvykle číslo, což znamená, že odpovídající SQL příkaz se vykoná, když je stejný; < isNotEmpty> znamená, že je vykonán, když není prázdný a není null; < isNotNull> znamená, že je vykonána, když není null. | odkaz | |
|