Gera duomenų bazės specifikacija padeda sumažinti programinės įrangos diegimo sudėtingumą ir komunikacijos išlaidas.
1. Geležinis sandėlio statybos dėsnis
- | Geležies įstatymas | Lygis | Pastaba | Simbolių rinkinys | Naudokite UTF-8. Jei jaustukas saugomas, saugojimui naudokite utf8mb4. | priverstinis |
| | Rūšiavimo taisyklės | Naudokite utf8_general_ci | priverstinis | |
2. Geležinis stalo konstrukcijos dėsnis
- | Geležies įstatymas | Lygis | Pastaba | Egzegezė | Būtinai turėkite lauko komentarus. | priverstinis |
| | Koduoti | Naudokite UTF-8. Jei jaustukas saugomas, saugojimui naudokite utf8mb4. | priverstinis |
| | ar laukas yra konceptualus | Jis turi būti pavadintas is_xx, o duomenų tipas yra nepasirašytas tinyint(1 taip, 0 ne), pvz., is_deleted(1 ištrinti, 0 neištrintas). | priverstinis | Bet kuris laukas turi būti nepasirašytas, jei jis nėra neigiamas | Lentelės pavadinimas, lauko pavadinimas | Galima naudoti tik mažąsias raides, apatinius brūkšnius ar skaičius; Draudžiama pradėti nuo pabraukimo ar skaičiaus; Draudžiami tik skaičiai tarp dviejų apatinių brūkšnių; Išjungti rezervuotus žodžius; Lentelių pavadinimuose draudžiama vartoti daugiskaitos daiktavardžius. | priverstinis |
| | Duomenų bazės pavadinimo ir lentelės pavadinimo pavadinimas | Duomenų bazės pavadinimas turi atitikti programos pavadinimą, o lentelės pavadinimas turi būti pavadintas lentelės verslo Name_Role. | priverstinis |
| | Indekso pavadinimas | Pirminio rakto indeksas naudoja pk_ lauko pavadinimą; Unikalus indeksas su uk_ lauko pavadinimu; Įprasti indeksai naudoja idx_ laukų pavadinimus. | priverstinis | pk_ yra pirminis raktas; uk_ yra unikalus raktas; idx_ yra indeksas | Dešimtainis tipas | Duomenų tipas yra dešimtainis, draudžiama naudoti float ir double, float ir double turi tikslumo nuostolius, o jei saugomų duomenų diapazonas viršija dešimtainių skaičių, rekomenduojama duomenis padalyti į sveikuosius ir dešimtainius skaičius ir saugoti juos atskirai. | priverstinis |
| | Varchar tipas | varchar yra kintama ilga eilutė, iš anksto neskiriama saugyklos vietos, ilgis neturėtų viršyti 5000 simbolių, jei ilgis didesnis nei 5000, taikykite tekstą (sukurkite atskirą lentelę, naudokite pirminį raktą, kad atitiktumėte, kad nepakenktumėte kitų laukų indeksavimo efektyvumui). | priverstinis |
| | Lentelės pavadinime turi būti trys laukai | ID (duomenų tipas yra nepasirašytas bigint, vienos lentelės prieaugis, žingsnio dydis yra 1), gmt_create, gmt_modified (aktyvus kūrimo laikas, pasyvus atnaujinimo laikas, duomenų tipas datetime). | priverstinis |
| | Lauko perteklius | Laukai leidžia atitinkamą dubliavimą, tačiau reikia atsižvelgti į duomenų nuoseklumą, o pertekliniai laukai turėtų būti 1) retai modifikuojami; 2) Ne varchar super ilgas laukas, jau nekalbant apie teksto lauką. | Rekomenduoti |
| | Duomenų bazės ir lentelių padalijimas | Skaidymas rekomenduojamas tik tada, kai vienos lentelės eilučių skaičius viršija 5 milijonus eilučių arba vienos lentelės talpa viršija 2 GB. | Rekomenduoti | |
Nustačius tinkamą simbolių saugojimo ilgį, ne tik sutaupoma vietos duomenų bazėje ir indekso saugykloje, bet dar svarbiau, pagerėja paieškos greitis.
3. Nustatykite indekso geležies dėsnį
- | Geležies įstatymas | Lygis | Pastaba | Unikalus indeksas | Laukai, turintys unikalių verslo ypatybių, net jei jie yra laukų derinys, turi būti unikaliai indeksuojami. Nors unikalus indeksas turi įtakos įterpimo greičiui, šis praradimas yra nereikšmingas, tačiau žymiai pagerina užklausos greitį. Be to, net jei programos sluoksnis turi labai pilną patikrinimo kontrolę, kol nėra unikalaus indekso, pagal Murphy dėsnį neišvengiamai bus generuojami nešvarūs duomenys. | priverstinis |
| | Prisijunkite | Daugiau nei trys lentelės draudžia sujungti, laukai, kuriuos reikia sujungti, o duomenų tipai turi būti nuoseklūs; Kai su užklausomis susietos kelios lentelės, įsitikinkite, kad susietuose laukuose turi būti indeksas. Net jei turite dvigubą lentelės sujungimą, atkreipkite dėmesį į lentelės indeksavimą, SQL našumą. | priverstinis |
| | Varcharfield | Turi būti nurodytas indekso ilgis ir nereikia indeksuoti visų laukų, tiesiog nustatykite indekso ilgį pagal faktinį teksto skirtumą. Indekso ilgis ir skirtumas yra prieštaravimų pora, paprastai eilutės tipo duomenims indeksų, kurių ilgis yra 20, skiriamasis laipsnis bus didesnis nei 90%, kurį galima nustatyti pagal skaičiaus (distinct left(column name, index length))/count(*) skirtumo laipsnį. | priverstinis |
| | Puslapio paieškoje draudžiama sulieti | Puslapio paieška draudžia sulieti arba visiškai sulieti, jei reikia, eikite į paieškos sistemą, kad tai išspręstumėte. Draudimo priežastis: indekso failas turi kairiausią priešdėlio atitikimo ypatybę B-Tree, ir jei reikšmė kairėje nėra nustatyta, tada ši rodyklė negali būti naudojama. | priverstinis |
| | Užsakyti pagal | Jei yra tvarka pagal scenarijų, atkreipkite dėmesį į indekso tvarką. Paskutinis eilės laukas yra kombinuoto indekso dalis ir dedamas indekso kombinacijos pabaigoje, kad būtų išvengta file_sort ir paveiktų užklausos našumą. Pavyzdys: kur a=? ir b=? Užsakymas pagal C; Indeksas turėtų būti sudarytas taip, kaip a_b_c; Priešingas pavyzdys: Jei indekse yra diapazono paieška, indekso tvarkos naudoti negalima, pvz., kai a>10 tvarka pagal b; Indekso a_b rūšiuoti negalima. | Rekomenduoti | |
4. Parašykite SQL geležies taisykles
- | Geležies įstatymas | Lygis | Pastaba | skaičius(*) | Nenaudokite count(column name) arba count(constant) vietoj count(*), kuris yra SQL92 apibrėžto standartinio eilučių skaičiaus sintaksė, nepriklausomai nuo duomenų bazės ir nepriklausoma nuo NULL ir ne NULL. count(*) skaičiuoja eilutes su NULL reikšme, o count(column name) neskaičiuoja eilučių su šiuo stulpeliu NULL. | priverstinis |
| | count(atskiras stulpelis) | Skaičiuoja unikalių stulpelio eilučių skaičių, išskyrus NULL. Atkreipkite dėmesį, kad count(distinct col1, col2), jei vienas iš stulpelių yra NULL, tada jis grąžina 0, net jei kito stulpelio reikšmė skiriasi. | priverstinis |
| | suma (col) | Kai visos stulpelio reikšmės yra NULL, count(col) grąžina 0, bet sum(col) grąžina NULL, todėl turite žinoti apie NPE problemas, kai naudojate sum(). NPE problemų galima išvengti šiais būdais: pasirinkite if(isnull(sum(g)), 0, sum(g)) iš lentelės; | priverstinis |
| | isnull | Naudokite isnull(), kad nustatytumėte, ar tai yra NULL reikšmė. NULL yra NULL, palyginti su bet kuria reikšme. | priverstinis |
| | Puslapių užklausos logika | Jei skaičius yra 0, jis turėtų būti grąžintas tiesiogiai, kad būtų išvengta tolesnio puslapių sakinio vykdymo. | priverstinis |
| | Išoriniai klavišai ir kaskados | Draudžiama naudoti išorinius raktus ir pakopas, o visos išorinio rakto sąvokos turi būti išspręstos programos lygmenyje. Priežastis: Išoriniai raktai ir kaskados netinka paskirstytiems, didelio sutapimo klasteriams, pakopiniai atnaujinimai stipriai blokuoja, kyla duomenų bazės atnaujinimo audrų pavojus, o išoriniai raktai turi įtakos duomenų bazės įterpimo greičiui. | priverstinis |
| | Saugomos procedūros | Saugomos procedūros yra draudžiamos, o saugomas procedūras sunku derinti ir išplėsti mastelį, be to, jos nėra perkeliamos. | priverstinis |
| | Duomenų taisymas | Taisydami duomenis (ypač naikindami ar modifikuodami įrašus), pirmiausia pasirinkite, kad išvengtumėte atsitiktinio naikinimo, ir vykdykite naujinimo sakinį tik įsitikinę, kad jis teisingas. | priverstinis |
| | Į | Jei to išvengti nepavyksta, nustatytų elementų skaičius po įėjimo turėtų būti kontroliuojamas per 1000. | Rekomenduoti |
| | Sutrumpinti lentelę | Draudžiama naudoti sutrumpintą lentelę, kuri yra greitesnė nei ištrinti ir naudoja mažiau sistemos ir žurnalo išteklių, tačiau sutrumpinti yra be operacijų ir nesukelia trigerių, kurie gali sukelti nelaimingus atsitikimus, todėl nenaudokite šio teiginio kūrimo kode. | Nuoroda |
|
5. ORM žemėlapiai geležies dėsniai
| - | Geležies įstatymas | Lygis | Pastaba | Lentelės užklausa | Laukų, kuriuos draudžiama naudoti * užklausoms, sąrašas turi būti aiškus, kurie laukai yra privalomi. | priverstinis |
| | POJO | POJO klasės Bulio logikos atributo negalima įtraukti į is, o duomenų bazės laukas turi būti įtrauktas į is, todėl reikia susieti laukus ir atributus resultMap. | priverstinis |
| | Grąžinimo parametrai | Draudžiama naudoti resultClass kaip grąžinimo parametrą, net jei visi klasės atributų pavadinimai po vieną atitinka duomenų bazės laukus, juos reikia apibrėžti; Savo ruožtu kiekviena lentelė turi turėti jį atitinkantį atributą. Priežastis: sukonfigūruokite susiejimo ryšį, kad laukas būtų susietas su DO klase, kad būtų lengva prižiūrėti. | priverstinis |
| | Grąžinimo parametrai | Draudžiama tiesiogiai naudoti "HashMap" ir "HashTable" kaip užklausos rezultatų rinkinio išvestį. Priežastis: atributo reikšmės tipas nevaldomas. | priverstinis |
| | sql.xml Konfigūruokite parametrus | sql.xml Naudokite #{}, #param# konfigūracijos parametrams ir nenaudokite ${}, nes ${} yra linkęs į SQL injekciją. | priverstinis |
| | queryForList | Draudžiama naudoti queryForList(String statementName, int start, int size), kuris pateikiamas su Mybatis. Priežastis: Jis įgyvendinamas nuskaitant visus SQL sakinio įrašus, atitinkančius statementName duomenų bazėje, o tada naudojant subsąrašą, kad gautumėte pradžios, dydžio poaibį. | priverstinis |
| | Atnaujinimo laikas | Atnaujindami duomenų bazės lentelės įrašą, tuo pačiu metu turite atnaujinti įrašo modifikavimo laiką. | priverstinis |
| | Atnaujinti duomenų bazės lentelės įrašus | Nerašykite didelės ir pilnos duomenų atnaujinimo sąsajos (perduotos kaip POJO klasė). Vykdydami SQL, neatnaujinkite nepakeistų laukų dėl klaidų, neefektyvios ir padidėjusios binlog saugyklos. | Rekomenduoti |
| | @Transactional | @Transactional Nepiktnaudžiaukite sandoriais. Sandoriai turi įtakos duomenų bazės QPS. Be to, kai naudojate operacijas, turite atsižvelgti į įvairius atšaukimo schemų aspektus, įskaitant talpyklos atšaukimą, paieškos sistemos grąžinimą, pranešimų kompensavimą, statistinį taisymą ir kt. | Nuoroda |
| | Mybatis dinaminės sql žymės | < compareValue isEqual> yra konstanta, palyginti su atributo reikšme, paprastai skaičiumi, nurodančiu, kad atitinkamas SQL sakinys vykdomas, kai lygus; < isNotEmpty> rodo, kad jis vykdomas, kai jis nėra tuščias ir nėra nulinis; < isNotNull> nurodo, kad jis vykdomas, kai jis nėra nulinis. | Nuoroda | |
|