Hea andmebaasi spetsifikatsioon aitab vähendada tarkvara rakendamise keerukust ja suhtluskulusid.
1. Laohoone ehitamise raudne seadus
- | Raudseadus | Tase | Märkus | Märgistik | Kasuta UTF-8. Kui emotikon on salvestatud, kasuta salvestamiseks utf8mb4. | sunnitud |
| | Sorteerimisreeglid | Kasuta utf8_general_ci | sunnitud | |
2. Laua ehituse raudseadus
- | Raudseadus | Tase | Märkus | Eksegees | Veendu, et sul oleksid välimärkused. | sunnitud |
| | Kodeerida | Kasuta UTF-8. Kui emotikon on salvestatud, kasuta salvestamiseks utf8mb4. | sunnitud |
| | kas väli on kontseptuaalne | See peab olema nimetatud is_xx-ga ning andmetüüp on allkirjastamata tinyint (1 jah, 0 ei), nt is_deleted(1 kustutatud, 0 mitte kustutatud). | sunnitud | Iga väli peab olema allkirjastamata, kui see ei ole negatiivne | Tabeli nimi, välja nimi | Võib kasutada ainult väikeseid tähti, alakriipse või numbreid; On keelatud alustada allajoonimise või numbriga; Ainult numbrid on keelatud kahe alakriipsu vahel; Keela reserveeritud sõnad; Mitmuse nimisõnade kasutamine on tabelinimedes keelatud. | sunnitud |
| | Andmebaasi ja tabeli nime nimetamine | Andmebaasi nimi peaks olema kooskõlas rakenduse nimega ning tabeli nimi peaks olema nimetatud tabeli ärilise Name_Role järgi. | sunnitud |
| | Indeksi nimetamine | Peamine võtmeindeks kasutab pk_ välja nime; Unikaalne indeks uk_ välja nimega; Tavalised indeksid kasutavad idx_ välja nimesid. | sunnitud | pk_ on primaarvõti; uk_ on ainulaadne võtme; idx_ on indeks | Kümnendkomaa tüüp | Andmetüüp on kümnendsüsteem ning ujuv ja kahekordne kasutamine on keelatud, ujuv ja kahekordne on täpsuskadu ning kui salvestatud andmevahemik ületab kümnendkohtade vahemiku, soovitatakse andmed jagada täisarvudeks ja kümnendkohtadeks ning salvestada need eraldi. | sunnitud |
| | Varchari tüüp | Varchar on muutuva pikkusega string, salvestusruumi ei ole ette eraldatud, pikkus ei tohiks ületada 5000 tähemärki, kui pikkus on suurem kui 5000, rakenda tekst (loo eraldi tabel, kasuta primaarklahvi vastamiseks, et vältida teiste väljade indekseerimise efektiivsuse mõjutamist). | sunnitud |
| | Tabeli nimes peab olema kolm välja | id (andmetüüp on allkirjastamata bigint, ühe tabeli juurdeehitus, sammu suurus 1), gmt_create, gmt_modified (aktiivne loomise aeg, passiivne uuendusaeg, andmetüüp on datetime). | sunnitud |
| | Välja redundantsus | Väljad võimaldavad sobivat redundantsust, kuid andmete järjepidevust tuleb arvestada ning redundantväljadel peaks olema 1) harva tehtud muudatusi; 2) Mitte varchari väga pikk väli, rääkimata tekstiväljast. | soovitama |
| | Jaga andmebaas ja tabelid | Partitsioneerimist soovitatakse ainult siis, kui ühe tabeli ridade arv ületab 5 miljonit rida või ühe tabeli maht ületab 2 GB. | soovitama | |
Sobiva tähemärgi salvestuspikkuse määramine säästab mitte ainult andmebaasitabeli ja indeksi salvestusruumi, vaid mis veelgi olulisem, parandab otsingukiirust.
3. Kehtesta indeksi rauaseadus
- | Raudseadus | Tase | Märkus | Unikaalne indeks | Väljad, millel on äris unikaalsed omadused, isegi kui need on erinevate väljade kombinatsioon, peavad olema unikaalselt indekseeritud. Kuigi unikaalne indeks mõjutab sisestuskiirust, on see kadu tühine, kuid see parandab oluliselt päringu kiirust. Lisaks, isegi kui rakenduskihil on väga täielik kontrollkontroll, siis seni, kuni unikaalne indeks puudub, genereeritakse paratamatult mustad andmed. | sunnitud |
| | liitumine | Rohkem kui kolm tabelit keelavad ühendamise, väljad, mis nõuavad liitmist, ning andmetüübid peavad olema järjepidevad; Kui mitmed tabelid on seotud päringutega, veendu, et vastavatel väljadel peab olema indeks. Isegi kui sul on kahekordne tabeliliitmine, pööra tähelepanu tabeli indekseerimisele ja SQL-i jõudlusele. | sunnitud |
| | Varcharfield | Indeksi pikkus tuleb täpsustada ja pole vaja kõiki välju indekseerida, vaid määrata indeksi pikkus vastavalt tegelikule teksti eristusele. Indeksi pikkus ja eristus on vastuolude paar; tavaliselt stringitüübi andmete puhul on indeksitel, mille pikkus on 20, eristusaste ületab 90%, mida saab määrata arvu (distinct left(veeru nimi, indeksi pikkus))/loend(*) eristusastme järgi. | sunnitud |
| | Lehe otsingus on hägustamine keelatud | Lehekülje otsing keelab hägustumise või täieliku hägususe, vajadusel palun minge otsingumootorisse, et see lahendada. Keelustamise põhjus: indeksifailil on B-puu vasakpoolseim eesliite sobitamise omadus ning kui vasakul olevat väärtust ei määrata, siis seda indeksit kasutada ei saa. | sunnitud |
| | Tellimus | Kui on järjekord stsenaariumite kaupa, pööra tähelepanu indeksi korrapärale. Viimane järjestusväli on osa kombineeritud indeksist ja paigutatakse indeksi kombinatsioonijärjekorra lõppu, et vältida file_sort ja mõjutada päringute tulemuslikkust. Näide: kus a=? ja b=? järjestus c; Indeks tuleks koostada kujul a_b_c; Vastunäide: Kui indeksis on vahemiku otsing, siis indeksi järjestust ei saa kasutada, näiteks kus a>10 tellimus b-ga; Index a_b ei saa sorteerida. | soovitama | |
4. Kirjuta SQL-i raudreeglid
- | Raudseadus | Tase | Märkus | loend(*) | Ära kasuta count(column name) ega count(constant) asemel count(*), mis on SQL92 standardarvu süntaks, sõltumatu andmebaasist ning sõltumatu NULList ja mitte-NULList. count(*) loendab ridu, mille väärtus on NULL, samas kui count(veeru nimi) ei loe ridu, mille veerg on NULL. | sunnitud |
| | Count (eristuv kolon) | Loendab veerus olevate unikaalsete ridade arvu, välja arvatud NULL. Pane tähele, et count (erinev col1, col2), kui üks veerg on kõik NULL, tagastab see 0 isegi siis, kui teisel veerul on erinev väärtus. | sunnitud |
| | sum(col) | Kui veeru väärtused on kõik NULL, tagastab count(col) 0, kuid sum(col) tagastab NULL, seega tuleb sum() kasutamisel olla teadlik NPE probleemidest. NPE probleeme saab vältida järgmistel viisidel: vali if(isnull(sum(g)), 0, sum(g)) tabelist; | sunnitud |
| | isnull | Kasuta isnull(), et määrata, kas see on NULL väärtus. NULL on NULL võrreldes iga väärtusega. | sunnitud |
| | Lehekülgede päringuloogika | Kui arv on 0, tuleks see otse tagastada, et vältida järgneva lehekülgede lause täitmist. | sunnitud |
| | Välisvõtmed ja kaskaadid | Võõrvõtmete kasutamine ja kaskaadimine on keelatud ning kõik võõrvõtmete mõisted tuleb lahendada rakenduskihil. Põhjus: Võõrvõtmed ja kaskaadid ei sobi hajutatud, kõrge samaaegsusega klastrite jaoks, kaskaadsed uuendused blokeerivad tugevalt, on oht andmebaasi uuenduste tormide tekkeks ning võõrvõtmed mõjutavad andmebaasi sisestamise kiirust. | sunnitud |
| | Salvestatud protseduurid | Salvestatud protseduurid on keelatud, salvestatud protseduurid on raskesti silutavad ja skaleeritavad ning need ei ole kaasaskantavad. | sunnitud |
| | Andmete korrigeerimine | Andmete parandamisel (eriti kirjete kustutamisel või muutmisel) vali esimesena, et vältida juhuslikku kustutamist, ja käivita uuenduslause alles pärast selle korrektsuse kinnitamist. | sunnitud |
| | sees | Kui seda ei saa vältida, peaks hulga elementide arvu kontrollima 1000 piires. | soovitama |
| | Lühendatud tabel | Truncate tabeli kasutamine on keelatud, mis on kiirem kui kustutamine ja kasutab vähem süsteemi- ja logiressursse, kuid truncate on tehinguvaba ega käivita päästikuid, mis võivad põhjustada õnnetusi, seega seda lauset ei kasutata arenduskoodis. | viide |
|
5. ORM kaardid rauaseadused
| - | Raudseadus | Tase | Märkus | Tabelipäring | Väljade nimekiri, mille * kasutamine päringute jaoks on keelatud, peab olema selge, millised väljad on vajalikud. | sunnitud |
| | POJO | POJO klassi Boole'i atribuuti ei saa lisada is-i, samas kui andmebaasi väli tuleb lisada is-i, mis nõuab tulemusMapi väljade ja atribuutide vahelist kaardistust. | sunnitud |
| | Tagasipöördumise parameetrid | On keelatud kasutada resultClass tagastusparameetrina, isegi kui kõik klassi atribuudi nimed vastavad andmebaasi väljadele ükshaaval, tuleb need määratleda; Omakorda peab igal tabelil olema sellele vastav atribuut. Põhjus: Seadista kaardistussuhe nii, et väli oleks ühendatud DO-klassiga, et hooldus oleks lihtne. | sunnitud |
| | Tagasipöördumise parameetrid | On keelatud kasutada HashMap'i ja HashTable'i otse päringutulemuste komplekti väljundina. Põhjus: Atribuudi väärtuse tüüp on kontrollimatu. | sunnitud |
| | sql.xml Seadista parameetrid | sql.xml Kasuta konfiguratsiooniparameetrite jaoks #{}, #param# ning ära kasuta ${}, kuna ${} on SQL-i süstimisele vastuvõtlik. | sunnitud |
| | queryForList | Mybatisega kaasas oleva queryForList (String statementName, int start, int size) kasutamine on keelatud. Põhjus: See rakendatakse nii, et taastatakse kõik SQL-lause kirjed, mis vastavad statementName'ile, andmebaasis, ning seejärel kasutatakse subList'i, et saada alamhulk algus, suurus. | sunnitud |
| | Uuendusaeg | Andmebaasitabeli kirje uuendamisel tuleb samal ajal uuendada ka kirje muutmisaega. | sunnitud |
| | Andmebaasitabeli kirjete uuendamine | Ära kirjuta suurt ja täielikku andmeuuenduse liidest (mis edastatakse POJO klassina). SQL-i käivitamisel ära uuenda muutumatuid välju vigade, ebaefektiivsete ja suurenenud binlogide salvestuse tõttu. | soovitama |
| | @Transactional | @Transactional Ära kuritarvita tehinguid. Tehingud mõjutavad andmebaasi QPS-i. Lisaks, kui kasutad tehinguid, tuleb arvestada erinevate rollback-skeemide aspektidega, sealhulgas vahemälu tagasikeeramine, otsingumootori tagasipööramine, sõnumikompensatsioon, statistiline korrigeerimine jne. | viide |
| | Mybatise dünaamilised SQL-sildid | < compareValue väärtuses isEqual> on konstant võrreldes atribuudi väärtusega, tavaliselt arv, mis näitab, et vastav SQL-lause täidetakse, kui on võrdne; < isNotEmpty> näitab, et see täidetakse siis, kui see ei ole tühi ega null; < isNotNull> näitab, et see käivitatakse siis, kui see ei ole null. | viide | |
|