Hyvä tietokantamäärittely auttaa vähentämään ohjelmiston toteutuksen monimutkaisuutta ja alentamaan viestintäkustannuksia.
1. Varaston rakentamisen rautalaki
- | Rautalaki | Taso | huomautus | Merkkijoukko | Käytä UTF-8:aa. Jos emoji on tallennettuna, käytä utf8mb4:ää tallennukseen. | pakotettu |
| | Lajittelusäännöt | Käytä utf8_general_ci | pakotettu | |
2. Pöydän rakentamisen rautalaki
- | Rautalaki | Taso | huomautus | eksegeesi | Varmista, että sinulla on kenttämerkinnät. | pakotettu |
| | koodata | Käytä UTF-8:aa. Jos emoji on tallennettuna, käytä utf8mb4:ää tallennukseen. | pakotettu |
| | onko kenttä käsitteellinen | Se on nimettävä is_xx:lla, ja tietotyyppi on allekirjoittamaton tinyint (1 kyllä, 0 ei), esim. is_deleted(1 poista, 0 ei poistettu). | pakotettu | Minkä tahansa kentän on oltava allekirjoittamaton, jos se ei ole negatiivinen | Taulukon nimi, kentän nimi | Vain pieniä kirjaimia, alaviivoja tai numeroita voidaan käyttää; On kiellettyä aloittaa alleviivalla tai numerolla; Vain numerot ovat kiellettyjä kahden aliviivan välissä; Poista varatut sanat käytöstä; Monikon substantiivien käyttö on kielletty taulukkonimissä. | pakotettu |
| | Tietokannan ja taulun nimen nimeäminen | Tietokannan nimen tulisi olla yhdenmukainen sovelluksen nimen kanssa, ja taulun nimi tulee nimetä taulun Business Name_Role mukaan. | pakotettu |
| | Indeksin nimeäminen | Ensisijainen avainindeksi käyttää pk_ kentän nimeä; Uniiki indeksi uk_ kentän nimellä; Normaalit indeksit käyttävät idx_ kentän nimiä. | pakotettu | pk_ on pääsävellaji; uk_ on ainutlaatuinen sävellaji; idx_ on indeksi | Desimaalityyppi | Tietotyyppi on desimaali, ja floatin ja tuplauksen käyttö on kiellettyä, float ja double aiheuttavat tarkkuuden menetyksen, ja jos tallennettu dataväli ylittää desimaalialueen, on suositeltavaa jakaa data kokonaislukuihin ja desimaaleihin sekä tallentaa ne erikseen. | pakotettu |
| | Varchar-tyyppi | Varchar on muuttuva pitkä merkkijono, tallennustilaa ei ole varattu etukäteen, pituuden ei saa ylittää 5000 merkkiä, jos pituus on yli 5000, sovelletaan tekstiä (luo erillinen taulukko, käytä ensisijaista avainta vastaamiseksi, jotta muiden kenttien indeksointitehokkuus ei vaikuteta). | pakotettu |
| | Taulukon nimessä täytyy olla kolme kenttää | id (tietotyyppi on unsigned bigint, single table increment, askelkoko on 1), gmt_create, gmt_modified (aktiivinen luontiaika, passiivinen päivitysaika, tietotyyppi on datetime). | pakotettu |
| | Kentän redundanssi | Kentät mahdollistavat asianmukaisen redundanssin, mutta datan yhdenmukaisuus on otettava huomioon, ja redundantteja kenttiä tulisi tehdä 1) harvoin muokattuja; 2) Ei varcharin superpitkä kenttä, saati sitten tekstikenttä. | suositella |
| | Jaa tietokanta ja taulukot | Osiointia suositellaan vain, kun yhden taulukon rivien määrä ylittää 5 miljoonaa riviä tai yhden taulukon kapasiteetti ylittää 2 GB. | suositella | |
Sopivan merkkien tallennuspituuden asettaminen säästää paitsi tietokantataulun ja indeksin tallennustilaa, myös parantaa hakunopeutta.
3. Luo indeksirautalaki
- | Rautalaki | Taso | huomautus | Uniikki indeksi | Alalla omaavat ainutlaatuiset ominaisuudet, vaikka ne olisivatkin eri kenttien yhdistelmä, on indeksoitava yksikäsitteisesti. Vaikka ainutlaatuinen indeksi vaikuttaa insertin nopeuteen, tämä menetys on merkityksetön, mutta se parantaa kyselynopeutta merkittävästi. Lisäksi, vaikka sovelluskerroksella olisi hyvin kattava tarkistuskontrolli, niin kauan kuin ainutlaatuista indeksiä ei ole, Murphyn lain mukaan syntyy väistämättä likaista dataa. | pakotettu |
| | liittyä | Yli kolme taulukkoa kieltää yhdistämisen, kentät, jotka vaativat liittämistä, ja tietotyyppien on oltava johdonmukaisia; Kun kyselyihin liittyy useita taulukoita, varmista, että niihin liittyville kentille tulee olla indeksi. Vaikka sinulla olisi kaksoistaululiitos, kiinnitä huomiota taulukkoindeksointiin ja SQL-suorituskykyyn. | pakotettu |
| | Varcharfield | Indeksin pituus täytyy määritellä, eikä kaikkia kenttiä tarvitse indeksoida, vaan määritetään indeksin pituus varsinaisen tekstin erottelun mukaan. Indeksin pituus ja erottelu ovat ristiriitoja; yleensä merkkijonotyyppisissä tietoissa indeksit, joiden pituus on 20, erotusaste on yli 90 %, mikä voidaan määrittää count(distinct left(sarakkeen nimi, indeksin pituus))/count(*) erotusasteen perusteella. | pakotettu |
| | Sumentaminen on kielletty sivuhaussa | Sivuhaku estää sumentamisen tai täydellisen sumentamisen, tarvittaessa mene hakukoneeseen ratkaisemaan se. Kieltoperuste: Indeksitiedostolla on B-puun vasemmanpuoleisin etuliitteen vastaavuusominaisuus, ja jos vasemmalla olevaa arvoa ei määritetä, tätä indeksiä ei voi käyttää. | pakotettu |
| | Järjestys | Jos järjestys on skenaarioittain, kiinnitä huomiota indeksin järjestäytymiseen. Viimeinen järjestyskenttä on osa yhdistettyä indeksiä ja sijoitetaan indeksin yhdistelmäjärjestyksen loppuun file_sort välttämiseksi ja kyselyn suorituskyvyn vaikuttamiseksi. Esimerkki: missä a=? ja b=? järjestys c:llä; Indeksi tulisi rakentaa muodossa a_b_c; Vastaesimerkki: Jos indeksissä on aluehaku, indeksin järjestyslukua ei voi käyttää, kuten missä a>10 järjestys b:llä; Indeksiä a_b ei voi lajitella. | suositella | |
4. Kirjoita SQL-rautasäännöt
- | Rautalaki | Taso | huomautus | count(*) | Älä käytä count(sarakkeen nimi) tai count(constant) count(*) sijaan, joka on syntaksi SQL92:n määrittelemälle rivimäärälle, riippumaton tietokannasta ja riippumaton NULLista ja ei-NULLista. count(*) laskee rivejä, joiden arvo on NULL, kun taas count(sarakkeen nimi) ei laske rivejä, joissa on tämä sarake NULL. | pakotettu |
| | count (erillinen col) | Laskee sarakkeessa olevien yksittäisten rivien määrän paitsi NULL. Huomaa, että count (erillinen col1, col2), jos yksi sarakkeista on kaikki NULL, se palauttaa 0, vaikka toisella sarakkeella olisi eri arvo. | pakotettu |
| | sum(col) | Kun sarakkeen arvot ovat kaikki NULL, count(col) palauttaa 0, mutta sum(col) palauttaa NULL, joten sinun täytyy olla tietoinen NPE-ongelmista sum() käytössä. NPE-ongelmia voidaan välttää seuraavilla tavoilla: valitse if(isnull(sum(g)), 0, sum(g)) taulukosta; | pakotettu |
| | isnull | Käytä isnull() määrittääksesi, onko kyseessä NULL-arvo. NULL on NULL verrattuna mihin tahansa arvoon. | pakotettu |
| | Sivutuskyselylogiikka | Jos luku on 0, se tulee palauttaa suoraan, jotta seuraava sivutuslauseke ei suoriteta. | pakotettu |
| | Ulommat avaimet ja putoukset | Vieraiden avainten käyttö ja kaskadi on kielletty, ja kaikki vierasavainkäsitteet on ratkaistava sovelluskerroksessa. Syy: Vierasavaimet ja sarjakkeet eivät sovellu hajautetuille, korkean rinnakkaisuuden klustereille, ketjuttautuvat päivitykset estävät voimaa, tietokantapäivitysmyrskyjen riski on ja vieraiden avaimet vaikuttavat tietokannan lisäysnopeuteen. | pakotettu |
| | Tallennetut menettelyt | Tallennetut proseduurit ovat kiellettyjä, ja tallennetut proseduurit ovat vaikeita debugata ja skaalautua, eivätkä ne ole siirrettäviä. | pakotettu |
| | Tietojen korjaus | Kun korjaat dataa (erityisesti tietueiden poistamisessa tai muokkaamisessa), valitse ensin estääksesi vahingossa tapahtuvan poiston, ja suorita päivityslauseke vasta sen jälkeen, kun olet varmistanut sen oikeellisuuden. | pakotettu |
| | sisään | Jos sitä ei voi välttää, joukko-alkioiden määrää tulisi säädellä 1000:n sisällä. | suositella |
| | Leikkaustaulukko | On kiellettyä käyttää truncate-taulukkoa, joka on nopeampi kuin delete ja käyttää vähemmän järjestelmä- ja lokiresursseja, mutta truncate on transaktiovapaa eikä laukaise triggerejä, mikä voi aiheuttaa vahinkoja, joten tätä lausetta ei kannata käyttää kehityskoodissa. | viittaus |
|
5. ORM kartoittaa rautalakeja
| - | Rautalaki | Taso | huomautus | Taulukkokysely | Listan kentistä, joiden * käyttö kyselyissä on kielletty, täytyy olla selkeä, mitkä kentät vaaditaan. | pakotettu |
| | POJO | POJO-luokan Boolean-attribuuttia ei voi lisätä i:hen, kun taas tietokantakenttä täytyy lisätä is:ään, mikä vaatii kenttien ja attribuuttien välisen kartoituksen resultMapissa. | pakotettu |
| | Paluuparametrit | On kiellettyä käyttää resultClassia palautusparametrina, vaikka kaikki luokan attribuuttinimet vastaisivat tietokantakenttiä yksitellen, ne täytyy määritellä; Jokaisella taulukolla täytyy puolestaan olla siihen vastaava attribuutti. Syy: Määritä kartoitussuhde niin, että kenttä yhdistetään DO-luokkaan helpon ylläpidon vuoksi. | pakotettu |
| | Paluuparametrit | On kiellettyä käyttää suoraan HashMapia ja HashTablea kyselytulosjoukon tuloksena. Syy: Attribuutin arvon tyyppi on hallitsematon. | pakotettu |
| | sql.xml Parametrien konfigurointi | sql.xml Käytä #{}, #param# konfiguraatioparametreina, äläkä käytä ${}, sillä ${} on altis SQL-injektiolle. | pakotettu |
| | queryForList | Mybatisin mukana tulevan queryForListin (String statementName, int start, int size) käyttö on kiellettyä. Syy: Se toteutetaan hakemalla kaikki SQL-lauseen tietueet, jotka vastaavat statementNamea, tietokannasta, ja käyttämällä alilistaa saadakseen alku- ja kokojoukon. | pakotettu |
| | Päivitysaika | Kun päivität tietokantataulun tietuetta, sinun täytyy päivittää myös tietueen muutosaika samaan aikaan. | pakotettu |
| | Päivitä tietokantataulutietueita | Älä kirjoita suurta ja täyttä datapäivitysrajapintaa (joka toimitetaan POJO-luokkana). Kun suoritat SQL:ää, älä päivitä muuttumattomia kenttiä virhealttiiden, tehottomien ja lisääntyneen binlogitallennustilan vuoksi. | suositella |
| | @Transactional | @Transactional Älä väärinkäytä tapahtumia. Transaktiot vaikuttavat tietokannan QPS:ään. Lisäksi, kun käytät transaktioita, sinun tulee ottaa huomioon erilaisia rollback-menetelmien osa-alueita, kuten välimuistin palautus, hakukoneiden palautus, viestien kompensointi, tilastollinen korjaus jne. | viittaus |
| | Mybatisin dynaamiset sql-tunnisteet | < compareValue isEqualissa> on vakio verrattuna attribuuttiarvoon, yleensä luku, joka osoittaa, että vastaava SQL-lause suoritetaan, kun se on yhtä suur; < isNotEmpty> tarkoittaa, että se suoritetaan, kun se ei ole tyhjä eikä nolla; < isNotNull> tarkoittaa, että se suoritetaan, vaikka se ei ole null. | viittaus | |
|