Dobra specifikacija podatkovne baze pomaga zmanjšati kompleksnost implementacije programske opreme in znižati stroške komunikacije.
1. Železni zakon gradnje skladišča
- | Železni zakon | Raven | Pripombo | Nabor znakov | Uporabi UTF-8. Če je emoji shranjen, uporabite utf8mb4 za shranjevanje. | prisiljeno |
| | Pravila razvrščanja | Uporabi utf8_general_ci | prisiljeno | |
2. Železni zakon konstrukcije miz
- | Železni zakon | Raven | Pripombo | Exegesis | Poskrbite, da boste imeli terenske opombe. | prisiljeno |
| | kodirati | Uporabi UTF-8. Če je emoji shranjen, uporabite utf8mb4 za shranjevanje. | prisiljeno |
| | Ali je področje konceptualno | Mora biti poimenovan z is_xx, podatkovni tip pa je nepredznaven tinyint(1 da, 0 ne), npr. is_deleted(1 izbriši, 0 ni izbrisano). | prisiljeno | Vsako polje mora biti brez znaka, če ni negativno | Ime tabele, ime polja | Uporabljajo se lahko le male črke, podčrte ali številke; Prepovedano je začeti s podčrtavanjem ali številko; Med dvema podčrtama so dovoljene le številke; Onemogoči rezervirane besede; Uporaba množinskih samostalnikov je v imenih tabel prepovedana. | prisiljeno |
| | Poimenovanje imena baze podatkov in imena tabele | Ime baze podatkov naj bo skladno z imenom aplikacije, ime tabele pa naj bo poimenovano s poslovnim Name_Role tabele. | prisiljeno |
| | Poimenovanje indeksa | Indeks primarnega ključa uporablja pk_ ime polja; Edinstven indeks z uk_ imenom polja; Običajni indeksi uporabljajo idx_ imena polj. | prisiljeno | pk_ je primarni tonalitet; uk_ je edinstven ključ; idx_ je indeks | Decimalni tip | Tip podatkov je decimalen, uporaba float in double je prepovedana, float in double pa imata izgubo natančnosti, če pa shranjeni razpon podatkov presega decimalni razpon, je priporočljivo podatke razdeliti na cela števila in decimalke ter jih shraniti ločeno. | prisiljeno |
| | Varchar tip | varchar je spremenljiv dolg niz, vnaprej ni dodeljenega prostora za shranjevanje, dolžina ne sme presegati 5000 znakov, če je dolžina večja od 5000, uporabite besedilo (ustvarite ločeno tabelo, uporabite primarni ključ za usklajevanje, da se ne vpliva na učinkovitost indeksiranja drugih polja). | prisiljeno |
| | V imenu tabele morajo biti tri polja | ID (podatkovni tip je Bigint brez predznaka, posamezna tabela inkrement, velikost koraka je 1), gmt_create, gmt_modified (aktivni čas ustvarjanja, pasivni čas posodobitve, podatkovni tip je datetime). | prisiljeno |
| | Poljska redundanca | Polja omogočajo ustrezno redundanco, vendar je treba upoštevati konsistentnost podatkov, redundantna polja pa naj imajo 1) redke spremembe; 2) Ne varcharjevo zelo dolgo polje, kaj šele besedilno polje. | priporočiti |
| | Razdelite bazo podatkov in tabele | Razdeljevanje je priporočljivo le, kadar število vrstic v eni tabeli presega 5 milijonov vrstic ali kapaciteta ene tabele presega 2 GB. | priporočiti | |
Nastavitev ustrezne dolžine shranjevanja znakov ne le prihrani prostor v tabeli baze podatkov in indekse, ampak kar je še pomembneje, izboljša hitrost pridobivanja znakov.
3. Vzpostavite indeksni železni zakon
- | Železni zakon | Raven | Pripombo | Unikatni indeks | Področja z edinstvenimi značilnostmi v podjetju, tudi če so kombinacija področij, morajo biti edinstveno indeksirana. Čeprav edinstven indeks vpliva na hitrost vstavljanja, je ta izguba zanemarljiva, vendar bistveno izboljša hitrost poizvedb. Poleg tega, tudi če ima aplikacijska plast zelo popoln nadzor nad preverjanjem, dokler ni edinstvenega indeksa, se po Murphyjevem zakonu neizogibno generirajo umazani podatki. | prisiljeno |
| | pridruži se | Več kot tri tabele preprečujejo združevanje, polja, ki zahtevajo združevanje, in podatkovni tipi morajo biti dosledni; Ko je več tabel povezanih s poizvedbami, poskrbite, da morajo imeti pripadajoča polja indeks. Tudi če imate dvojno združevanje tabel, bodite pozorni na indeksiranje tabel in zmogljivost SQL. | prisiljeno |
| | Varcharfield | Dolžino indeksa je treba določiti, ni pa treba indeksirati vseh polj, temveč določiti dolžino indeksa glede na dejansko razliko med besedilom. Dolžina indeksa in razlikovanje sta par protislovij; pri podatkih o tipu niza bodo indeksi z dolžino 20 imeli stopnjo razlikovanja več kot 90 %, ki jo lahko določimo z razlikovalno stopnjo števila (jasno levo (ime stolpca, dolžina indeksa))/števila(*). | prisiljeno |
| | Zameglitev je pri iskanju po strani prepovedana | Iskanje po straneh prepoveduje zamegljevanje ali popolno zamegljenost, če je potrebno, pojdite na iskalnik in to rešite. Razlog prepovedi: Indeksna datoteka ima lastnost ujemanja predpone na levi strani B-drevesa, in če vrednost na levi ni določena, tega indeksa ni mogoče uporabiti. | prisiljeno |
| | vrstni red po | Če obstaja vrstni red po scenarijih, bodite pozorni na urejenost indeksa. Zadnje polje vrstnega reda z je del združenega indeksa in je postavljeno na konec vrstnega reda kombinacije indeksov, da se izognemo file_sort in vplivamo na uspešnost poizvedb. Primer: kje a=? in b=? vrstni red po c; Indeks naj bo zgrajen kot a_b_c; Protiprimer: Če je v indeksu iskanje razpona, potem urejenosti indeksa ni mogoče uporabiti, na primer kjer je a>10 vrstni red po b; Indeksnih a_b ni mogoče razvrstiti. | priporočiti | |
4. Napišite SQL železna pravila
- | Železni zakon | Raven | Pripombo | count(*) | Ne uporabljajte count(ime stolpca) ali count(constant) namesto count(*), ki je sintaksa za standardno število vrstic, določeno v SQL92, neodvisno od baze podatkov in neodvisno od NULL in ne-NULL. count(*) šteje vrstice z vrednostjo NULL, medtem ko count(ime stolpca) ne šteje vrstic s tem stolpcem NULL. | prisiljeno |
| | Grof(ločen stol) | Šteje število unikatnih vrstic v stolpcu, razen NULL. Upoštevajte, da count(distinct col1, col2), če je eden od stolpcev v celoti NULL, vrne 0, tudi če ima drugi stolpec drugačno vrednost. | prisiljeno |
| | Sum(col) | Ko so vrednosti stolpca vse NULL, count(col) vrne 0, sum(col) pa vrne NULL, zato morate biti pozorni na težave z NPE pri uporabi sum(). NPE problemom se lahko izognemo na naslednje načine: izberite if(isnull(sum(g)), 0, sum(g)) iz tabele; | prisiljeno |
| | isnull | Uporabite isnull(), da določite, ali je vrednost NULL. NULL je NULL v primerjavi s katerokoli vrednostjo. | prisiljeno |
| | Logika poizvedb s strani | Če je število 0, ga je treba vrniti neposredno, da se prepreči izvajanje naslednje paginacijske stavke. | prisiljeno |
| | Zunanji ključi in kaskade | Uporaba tujih ključev in kaskadiranje je prepovedana, vsi koncepti tujih ključev pa morajo biti rešeni na aplikacijski plasti. Razlog: Tuji ključi in kaskade niso primerni za razpršene, visoko sočasne grozde, kaskadne posodobitve močno blokirajo, obstaja tveganje za nevihtne posodobitve podatkov, tuji ključi pa vplivajo na hitrost vstavljanja podatkovne baze. | prisiljeno |
| | Shranjene procedure | Shranjene procedure so prepovedane, shranjene postopke pa je težko razhroščevati in skalirati, prav tako niso prenosljive. | prisiljeno |
| | Popravek podatkov | Pri popravljanju podatkov (zlasti brisanju ali spreminjanju zapisov) najprej izberite tako, da se izognete nenamernemu brisanju, in izvršite ukaz posodobitve šele po potrditvi, da je pravilen. | prisiljeno |
| | v | Če se temu ni mogoče izogniti, bi moralo biti število elementov za in nadzorovano znotraj 1000. | priporočiti |
| | Tabela obrezovanja | Uporaba truncate tabele je prepovedana, saj je hitrejša od brisanja in porabi manj sistemskih in dnevniških virov, vendar je trunkate brez transakcij in ne sproži sprožilcev, ki bi lahko povzročili nesreče, zato te izjave ne uporabljajte v razvojni kodi. | Referenčni |
|
5. ORM zemljevidi železnih zakonov
| - | Železni zakon | Raven | Pripombo | Poizvedba po tabeli | Seznam polj, ki je prepovedana uporaba * za poizvedbe, mora biti jasen, katera polja so zahtevana. | prisiljeno |
| | POJO | Booleov atribut razreda POJO ni mogoče dodati v is, medtem ko je treba polje baze podatkov dodati v is, kar zahteva preslikavo med polji in atributi v resultMap. | prisiljeno |
| | Parametri vrnitve | Uporaba resultClass kot parametra za vračilo je prepovedana, tudi če vsa imena atributov razreda ustrezajo poljem baze podatkov eno za drugim, jih je treba definirati; Vsaka tabela mora imeti atribut, ki ji ustreza. Razlog: Nastavite razmerje preslikave tako, da povežete polje z razredom DO za lažje vzdrževanje. | prisiljeno |
| | Parametri vrnitve | Prepovedano je neposredno uporabljati HashMap in HashTable kot izhod nabora rezultatov poizvedbe. Razlog: Vrsta vrednosti atributa je neobvladljiva. | prisiljeno |
| | sql.xml Nastavitev parametrov | sql.xml Uporabite #{}, #param# za konfiguracijske parametre in ne uporabljajte ${}, saj je ${} nagnjen k SQL injekciji. | prisiljeno |
| | queryForList | Uporaba queryForList (String statementName, int start, int size), ki je priložena Mybatisu, je prepovedana. Razlog: Implementira se tako, da pridobimo vse zapise SQL ukaza, ki ustrezajo statementName v bazi podatkov, nato pa uporabimo podseznam za pridobitev podmnožice začetne velikosti. | prisiljeno |
| | Čas posodobitve | Pri posodabljanju zapisa tabele v bazi podatkov morate hkrati posodobiti čas spremembe zapisa. | prisiljeno |
| | Posodobite zapise tabel v bazi podatkov | Ne piši velikega in popolnega vmesnika za posodobitev podatkov (posredovanega kot POJO razred). Pri izvajanju SQL ne posodabljajte nespremenjenih polj zaradi napak, neučinkovitosti in povečanega shranjevanja binlogov. | priporočiti |
| | @Transactional | @Transactional Ne zlorabljajte transakcij. Transakcije vplivajo na QPS baze podatkov. Poleg tega, kjer uporabljate transakcije, morate upoštevati različne vidike shem povračila, vključno z vračanjem predpomnilnika, vračanjem v iskalnikih, kompenzacijo sporočil, statističnim popravkom itd. | Referenčni |
| | Mybatis dynamic sql oznake | < compareValue v isEqual> je konstanta v primerjavi z vrednostjo atributa, običajno številko, ki označuje, da se ustrezni SQL ukaz izvede, ko je enak; < isNotEmpty> pomeni, da se izvede, ko ni prazen in ni ničen; < isNotNull> pomeni, da se izvede, ko ni null. | Referenčni | |
|