Dobrá špecifikácia databázy pomáha znižovať zložitosť implementácie softvéru a náklady na komunikáciu.
1. Železný zákon výstavby skladu
- | Železný zákon | Úroveň | poznámka | Sada znakov | Použi UTF-8. Ak je emoji uložený, použite utf8mb4 na uloženie. | Nútený |
| | Pravidlá triedenia | Použi utf8_general_ci | Nútený | |
2. Železný zákon konštrukcie stola
- | Železný zákon | Úroveň | poznámka | Exegéza | Nezabudnite mať terénne poznámky. | Nútený |
| | kódovať | Použi UTF-8. Ak je emoji uložený, použite utf8mb4 na uloženie. | Nútený |
| | či je odbor konceptuálny | Musí byť pomenovaný is_xx a dátový typ je nepodpísaný tinyint(1 áno, 0 nie), napr. is_deleted(1 delete, 0 not deleted). | Nútený | Každé pole musí byť bez znamienka, ak nie je záporné | Názov tabuľky, názov poľa | Môžu sa používať iba malé písmená, podčiarknutia alebo čísla; Je zakázané začínať podčiarknutím alebo číslom; Iba čísla sú zakázané medzi dvoma podčiarknutiami; Vypnúť rezervované slová; Používanie množných podstatných mien je v názvoch tabuliek zakázané. | Nútený |
| | Pomenovanie názvu databázy a názvu tabuľky | Názov databázy by mal byť v súlade s názvom aplikácie a názov tabuľky by mal byť pomenovaný ako Business Name_Role tabuľky. | Nútený |
| | Pomenovanie indexu | Primárny kľúčový index používa pk_ názov poľa; Jedinečný index s uk_ názvom poľa; Bežné indexy používajú idx_ názvy polí. | Nútený | pk_ je primárna tónina; uk_ je jedinečný kľúč; idx_ je index | Desatinný typ | Dátový typ je desatinný a používanie float a double je zakázané, float a double majú stratu presnosti, a ak uložený rozsah dát presahuje rozsah desatinných čísel, odporúča sa rozdeliť údaje na celé a desatinné čísla a uložiť ich samostatne. | Nútený |
| | Varchar typ | Varchar je variabilný dlhý reťazec, vopred nie je pridelený žiadny úložný priestor, dĺžka by nemala presiahnuť 5000 znakov, ak je dĺžka väčšia ako 5000, použite text (vytvorte samostatnú tabuľku, použite primárny kľúč na korešpondenciu, aby ste neovplyvnili efektivitu indexovania iných polí). | Nútený |
| | V názve tabuľky musia byť tri polia | ID (dátový typ je neznamienkový bigint, prírastok jednej tabuľky, veľkosť kroku je 1), gmt_create, gmt_modified (aktívny čas vytvorenia, pasívny čas aktualizácie, typ dáta je dátum čas). | Nútený |
| | Redundancia v teréne | Polia umožňujú primeranú redundanciu, ale je potrebné zohľadniť konzistenciu dát a redundantné polia by mali mať 1) zriedkavé úpravy; 2) Nie veľmi dlhé pole, nieto ešte textové pole. | odporúčať |
| | Rozdeľte databázu a tabuľky | Rozdelenie sa odporúča len vtedy, keď počet riadkov v jednej tabuľke presahuje 5 miliónov riadkov alebo kapacita jednej tabuľky presahuje 2 GB. | odporúčať | |
Nastavenie vhodnej dĺžky ukladania znakov nielenže šetrí miesto v databázových tabuľkách a indexoch, ale čo je dôležitejšie, zlepšuje rýchlosť vyhľadávania.
3. Stanoviť indexový železný zákon
- | Železný zákon | Úroveň | poznámka | Jedinečný index | Oblasti s jedinečnými charakteristikami v podnikaní, aj keď sú kombináciou polí, musia byť jednoznačne indexované. Hoci jedinečný index ovplyvňuje rýchlosť vkladania, táto strata je zanedbateľná, no výrazne zlepšuje rýchlosť dotazovania. Navyše, aj keď má aplikačná vrstva veľmi kompletnú kontrolu kontroly, pokiaľ neexistuje jedinečný index, podľa Murphyho zákona sa nevyhnutne generujú špinavé dáta. | Nútený |
| | Pridajte sa | Viac ako tri tabuľky zakazujú spojenie, polia, ktoré vyžadujú spojenie, a dátové typy musia byť konzistentné; Keď je s dotazmi spojených viacero tabuliek, uistite sa, že príslušné polia musia mať index. Aj keď máte dvojité spájanie tabuliek, venujte pozornosť indexovaniu tabuliek, výkonu SQL. | Nútený |
| | Varcharfield | Dĺžka indexu musí byť špecifikovaná a nie je potrebné indexovať všetky polia, stačí určiť dĺžku indexu podľa skutočného rozlíšenia textu. Dĺžka indexu a rozlíšenie sú dvojica protirečení, vo všeobecnosti pri dátach typu reťazca budú mať indexy s dĺžkou 20 stupeň rozlíšenia viac ako 90 %, ktorý možno určiť podľa rozlišovacieho stupňa počtu(distinct left(názov stĺpca, indexová dĺžka))/count(*). | Nútený |
| | Rozmazanie je pri vyhľadávaní stránok zakázané | Vyhľadávanie stránok zakazuje rozmazanie alebo úplné rozmazanie, ak je to potrebné, prosím, choďte na vyhľadávač a vyriešite to. Dôvod zákazu: Indexový súbor má vlastnosť zhody najľavšej predpony B-stromu, a ak hodnota naľavo nie je určená, tento index sa nedá použiť. | Nútený |
| | poradie podľa | Ak existuje poradie podľa scenára, venujte pozornosť usporiadanosti indexu. Posledné pole poradia je súčasťou kombinovaného indexu a je umiestnené na konci poradia kombinácií indexov, aby sa predišlo file_sort a ovplyvnilo výkon dotazu. Príklad: kde a=? a b=? poradie podľa c; Index by mal byť zostavený ako a_b_c; Protipríklad: Ak je v indexe vyhľadávanie v rozsahu, potom nemožno využiť usporiadanosť indexu, napríklad kde a>10 je poradie podľa b; Indexové a_b nie je možné zoradiť. | odporúčať | |
4. Napíšte SQL železné pravidlá
- | Železný zákon | Úroveň | poznámka | count(*) | Nepoužívajte count(column name) alebo count(constant) namiesto count(*), čo je syntax pre štandardný počet riadkov definovaný SQL92, nezávislý od databázy a nezávislý od NULL a non-NULL. count(*) počíta riadky s hodnotou NULL, zatiaľ čo count(názov stĺpca) nepočíta riadky s týmto stĺpcom NULL. | Nútený |
| | gróf (odlišný col) | Počíta počet unikátnych riadkov v stĺpci okrem NULL. Všimnite si, že count(distinct col1, col2), ak je jeden zo stĺpcov NULL, vráti 0, aj keď druhý stĺpec má inú hodnotu. | Nútený |
| | sum(col) | Keď sú hodnoty stĺpca všetky NULL, count(col) vráti 0, ale sum(col) vráti NULL, takže je potrebné dávať pozor na problémy s NPE pri použití sum(). NPE problémy sa dajú vyhnúť nasledujúcimi spôsobmi: vyberte if(isnull(sum(g)), 0, sum(g)) z tabuľky; | Nútený |
| | isnull | Použite isnull() na určenie, či je to hodnota NULL. NULL je NULL v porovnaní s akoukoľvek hodnotou. | Nútený |
| | Logika stránkovania dotazov | Ak je počet 0, mal by byť vrátený priamo, aby sa predišlo vykonaniu následného stránkovacieho príkazu. | Nútený |
| | Vonkajšie kľúče a kaskády | Používanie cudzích kľúčov a kaskádovanie je zakázané a všetky koncepty cudzích kľúčov musia byť vyriešené na aplikačnej vrstve. Dôvod: Cudzie kľúče a kaskády nie sú vhodné pre distribuované klastre s vysokou súbežnosťou, kaskádové aktualizácie sú silným blokovaním, hrozí riziko búrok aktualizácií databázy a cudzie kľúče ovplyvňujú rýchlosť vkladania databázy. | Nútený |
| | Uložené procedúry | Uložené procedúry sú zakázané a uložené procedúry sa ťažko ladia a škálujú, a nie sú prenosné. | Nútený |
| | Korekcia dát | Pri oprave dát (najmä pri mazaní alebo úprave záznamov) vyberte ako prvú, aby ste sa vyhli náhodnému vymazaniu, a vykonajte update príkaz až po potvrdení jeho správnosti. | Nútený |
| | v | Ak sa tomu nedá vyhnúť, počet prvkov po vstupe by mal byť kontrolovaný do 1000. | odporúčať |
| | Tabuľka orezania | Je zakázané používať truncate table, ktorá je rýchlejšia ako delete a spotrebuje menej systémových a logovacích zdrojov, ale trunkate je bez transakcií a nespúšťa triggery, ktoré môžu spôsobiť nehody, preto tento príkaz nepoužívajte vo vývojovom kóde. | referencia |
|
5. ORM mapuje železné zákony
| - | Železný zákon | Úroveň | poznámka | Dotaz na tabuľku | Zoznam polí, ktoré je zakázané používať * pre dotazy, musí byť jasný, ktoré polia sú potrebné. | Nútený |
| | POJO | Booleov atribút triedy POJO nemožno pridať k is, zatiaľ čo databázové pole musí byť pridané do is, čo vyžaduje mapovanie medzi poliami a atribútmi vo resultMap. | Nútený |
| | Návratové parametre | Je zakázané používať resultClass ako návratový parameter, aj keď všetky názvy atribútov triedy zodpovedajú databázovým poliam jedno po druhom, musia byť definované; Každá tabuľka musí mať svoj atribút, ktorý jej zodpovedá. Dôvod: Nastavte mapovací vzťah tak, aby ste spojili pole s triedou DO pre jednoduchú údržbu. | Nútený |
| | Návratové parametre | Je zakázané priamo používať HashMap a HashTable ako výstup výsledkovej množiny dotazov. Dôvod: Typ hodnoty atribútu je nekontrolovateľný. | Nútený |
| | sql.xml Nastaviť parametre | sql.xml Používajte #{}, #param# pre konfiguračné parametre a nepoužívajte ${}, pretože ${} je náchylný na SQL injection. | Nútený |
| | queryForList | Použitie queryForList (String statementName, int start, int size), ktoré je súčasťou Mybatis, je zakázané. Dôvod: Implementuje sa tak, že sa získajú všetky záznamy SQL príkazu zodpovedajúce statementName v databáze a potom sa pomocou podzoznamu získa podmnožina veľkosti štart. | Nútený |
| | Čas aktualizácie | Pri aktualizácii záznamu databázovej tabuľky musíte zároveň aktualizovať čas úpravy záznamu. | Nútený |
| | Aktualizujte záznamy databázových tabuliek | Nepíšte veľké a kompletné rozhranie na aktualizáciu dát (odovzdávané ako trieda POJO). Pri vykonávaní SQL neaktualizujte nezmenené polia kvôli chybovým, neefektívnym a zvýšeným binlogovým úložiskám. | odporúčať |
| | @Transactional | @Transactional Nezneužívajte transakcie. Transakcie ovplyvňujú QPS databázy. Okrem toho, kde používate transakcie, musíte zohľadniť rôzne aspekty rollback schém, vrátane cache rollback, rollback vo vyhľadávačoch, kompenzácie správ, štatistickej korekcie a podobne. | referencia |
| | Mybatis dynamic sql tagy | < compareValue v isEqual> je konštanta v porovnaní s hodnotou atribútu, zvyčajne číslo, čo znamená, že príslušný SQL príkaz sa vykoná, keď je rovnaký; < isNotEmpty> znamená, že sa vykonáva, keď nie je prázdny a nie je null; < isNotNull> znamená, že sa vykoná, keď nie je null. | referencia | |
|