Egy jó adatbázis-specifikáció segít csökkenteni a szoftver megvalósításának összetettségét és csökkenteni a kommunikációs költségeket.
1. Raktárépítés vastörvénye
- | Vastörvény | Szint | megjegyzés | Karakterkészlet | Használj UTF-8-at. Ha az emoji tárolt, használd utf8mb4 tárolásra. | kényszerítve |
| | Rendezési szabályok | Használd utf8_general_ci | kényszerítve | |
2. Az asztalépítés vastörvénye
- | Vastörvény | Szint | megjegyzés | egzegézis | Mindenképpen legyenek terepi jegyzetek. | kényszerítve |
| | kódol | Használj UTF-8-at. Ha az emoji tárolt, használd utf8mb4 tárolásra. | kényszerítve |
| | hogy a mező fogalmi volt-e | A név is_xx-vel kell elnevezni, és az adattípus nem aláírt tinyint (1 igen, 0 nem), pl. is_deleted(1 törlés, 0 nem törölve). | kényszerítve | Bármely mezőnek nem kell aláírni, ha nem negatív | Tábla neve, mező neve | Csak kisbetűk, aláhúzások vagy számok használhatók; Tilos aláhúzással vagy számmal kezdeni; Csak számok használata két aláhúzás között tilos; Tiltsd ki a fenntartott szavakat; Többes számú főnevek használata tilos a táblanevekben. | kényszerítve |
| | Az adatbázis és tábla nevének elnevezése | Az adatbázis nevének összhangban kell lennie az alkalmazás nevével, és a tábla nevének az üzleti Name_Role szerint kell elnevezni. | kényszerítve |
| | Index elnevezés | A fő kulcsindex pk_ mezőnevet használ; Egyedi index uk_ mezőnevével; A normál indexek idx_ mezőneveket használnak. | kényszerítve | pk_ a fő hangnem; uk_ egyedi hangnem; idx_ index | Tizedes típus | Az adattípus tizedes, a lebegő és duplázó használata tilos, a lebegő és a duplázó pontosságvesztéssel jár, és ha a tárolt adattartomány meghaladja a tizedes tartományt, ajánlott az adatokat egész és tizedes számokra bontani, és külön tárolni. | kényszerítve |
| | Varchar típus | A varchar egy változó hosszú lánc, előre nincs tárolóhely, a hossz nem haladhatja meg az 5000 karaktert, ha a hossz nagyobb, ha a hossz 5000-nél nagyobb, alkalmazz szöveget (készíts külön táblát, használd a fő kulcsot a megfelelő megoldáshoz, hogy elkerüld a többi mező indexelési hatékonyságának befolyásolását). | kényszerítve |
| | A tábla nevében három mező kell lennie | id (adattípus: nem aláírt bigint, egyetlen tábla-inkrement, lépésméret 1), gmt_create, gmt_modified (aktív létrehozási idő, passzív frissítési idő, adattípus dátumidő). | kényszerítve |
| | Mezőredundancia | A mezők megfelelő redundanciát biztosítanak, de figyelembe kell venni az adatok konzisztenciáját, és a redundáns mezőknek 1) ritkán kell módosítaniuk; 2) Nem egy nagyon hosszú mező, nemhogy szövegmező. | ajánl |
| | Oszd meg az adatbázist és a táblákat | A partíció csak akkor ajánlott, ha egy táblázat sorainak száma meghaladja az 5 millió sort, vagy ha egy tábla kapacitása meghaladja a 2 GB-ot. | ajánl | |
A megfelelő karaktertárolási hossz beállítása nemcsak az adatbázis tábla- és indextárolóhelyet takarítja meg, hanem ami még fontosabb, javítja a keresési sebességet.
3. Hozz létre egy index-vastörvényt
- | Vastörvény | Szint | megjegyzés | Egyedi index | Az üzletben egyedi jellemzőkkel rendelkező mezőket, még ha ezek a mezők kombinációja is, egyedileg indexelni kell. Bár az egyedi index befolyásolja a beilleszkedési sebességet, ez a veszteség elhanyagolható, de jelentősen javítja a lekérdezési sebességet. Ezen túl, még ha az alkalmazásréteg teljes ellenőrzési ellenőrzéssel rendelkezik is, amíg nincs egyedi index, a Murphy-törvény szerint elkerülhetetlenül piszkos adatok keletkeznek. | kényszerítve |
| | Csatlakozzon | Több mint három tábla tiltja a csatlakozást, a csatlakozást igénylő mezők és az adattípusoknak következetesnek kell lenniük; Ha több tábla is lekérdezésekhez van társítva, győződjön meg róla, hogy a hozzá tartozó mezőknek legyen egy indexük. Még ha dupla táblacsatlakozásod is van, figyelj a táblázatindexelésre és az SQL teljesítményre. | kényszerítve |
| | Varcharfield | Az index hosszát meg kell határozni, és nem szükséges minden mezőt indexelni, csak a tényleges szöveg szerinti különbség alapján határozzuk meg az index hosszát. Az index hossza és megkülönböztetés ellentmondáspáros, általában a string típusú adatoknál a 20 hosszú indexek megkülönböztetési fokozata több mint 90%, amit a count (distinct bal(oszlop neve, index hossz))/count(*) megkülönböztetési foka határozhat meg. | kényszerítve |
| | Az oldalkeresésnél tilos az elmosódás | Az oldalkeresés tiltja az elmosódást vagy a teljes elmosódást, ha szükséges, kérjük, menj a keresőmotorhoz a megoldáshoz. Tilalom ok: Az indexfájl a B-fa ballegbalabb előtagjának megfelelője van, és ha a bal oldali érték nincs meghatározva, akkor ez az index nem használható. | kényszerítve |
| | Rendezés | Ha van forgatókönyv szerinti sorrend, figyelj az index rendezettségére. Az utolsó mező az egyesített index része, és az index kombinációs sorrend végén helyezik el, hogy elkerüljék a file_sort és befolyásolják a lekérdezések teljesítményét. Példa: ahol a=? és b=? c-vel sorrend; Az indexet úgy kell felépíteni, hogy a_b_c; Ellenpélda: Ha az indexben van tartománykeresés, akkor az index sorrendi értéke nem használható, például ahol a>10 b-re sorrend; Az index a_b nem rendezhető. | ajánl | |
4. Írj SQL vasszabályokat
- | Vastörvény | Szint | megjegyzés | count(*) | Ne használd a count(column name) vagy count(constant) kifejezéseket a count(*) helyett, amely az SQL92 által meghatározott sorok standard számának szintaxisa, függetlenül az adatbázistól, és független a NULL és a non-NULL-tól. a count(*) a NULL értékű sorokat számolja, míg a count(oszlop neve) nem számolja azokat a sorokat, amelyekben ez a NULL oszlop van. | kényszerítve |
| | Count (megkülönböztető col) | Számolja az oszlopban lévő egyedi sorok számát, kivéve a NULL-t. Fontos megjegyezni, hogy a count (külön col1, col2), ha az egyik oszlop mind NULL, akkor 0-t ad vissza, még akkor is, ha a másik oszlop más értékkel rendelkezik. | kényszerítve |
| | sum(col) | Ha egy oszlop értéke mind NULL, a count(col) 0-ot ad, de a sum(col) NULL-t, ezért figyelni kell az NPE problémákra a sum() használatkor. Az NPE problémák a következő módokon kerülhetők: válasszuk if(isnull(sum(g)), 0, sum(g)) a táblából; | kényszerítve |
| | isnull | Használd az isnull() gombot, hogy megállapítsuk, NULL érték-e. A NULL NULL bármely értékhez képest. | kényszerítve |
| | A paginációs lekérdezés logika | Ha a szám 0, akkor közvetlenül vissza kell küldeni, hogy elkerüljék a következő oldalozási utasítás végrehajtását. | kényszerítve |
| | Külső kulcsok és zuskadok | Idegen kulcsok használata és kaszkádozása tilos, és minden idegen kulcsfogalmat az alkalmazási rétegen kell megoldani. Ok: Az idegen kulcsok és kaszkádok nem alkalmasak elosztott, nagy párhuzamú klaszterekhez, a kaszkádfrissítések erősen blokkolnak, fennáll az adatbázis-frissítési viharok kockázata, és az idegen kulcsok befolyásolják az adatbázis behelyezési sebességét. | kényszerítve |
| | Tárolt eljárások | A tárolt eljárások tiltottak, a tárolt eljárásokat nehéz hibakeresés és skálázás szempontjából, és nem hordozhatók. | kényszerítve |
| | Adatkorrekció | Adatjavításkor (különösen a rekordok törlése vagy módosítása) először válaszd az elsőt, hogy elkerüld a véletlen törlést, és csak akkor hajtsd végre a frissítési utasítást, ha megerősíted a helyességét. | kényszerítve |
| | in | Ha nem lehet elkerülni, akkor a következő készletelemek számát 1000-en belül kell szabályozni. | ajánl |
| | Rövidített táblázat | Tilos a truncate table használata, amely gyorsabb, mint a törlés, és kevesebb rendszer- és naplót használ, de a truncate tranzakciómentes, és nem indít triggereket, amelyek baleseteket okozhatnak, ezért ezt a mondatot ne használd fejlesztési kódban. | utalás |
|
5. Az ORM vastörvényeket térképeznek
| - | Vastörvény | Szint | megjegyzés | Táblalekérdezés | A * lekérdezéshez tilos mezők listájának egyértelműnek kell lennie, mely mezők szükségesek. | kényszerítve |
| | POJO | A POJO osztály Boolean attribútumja nem adható hozzá az is-hez, míg az adatbázis mezőt is kategóriába kell adni, ami megköveteli a mezők és attribútumok közötti leképezést az resultMap-ben. | kényszerítve |
| | Visszatérési paraméterek | Tilos a resultClass-ot visszaküldési paraméterként használni, még akkor is, ha minden osztályattribútumnev egyenként egyezik az adatbázis mezőivel, azokat definiálni kell; Cserébe minden táblának kell lennie egy hozzá tartozó attribútummal. Ok: Konfiguráld a leképezési kapcsolatot, hogy a mezőt a DO osztályhoz kapcsolja az egyszerű karbantartás érdekében. | kényszerítve |
| | Visszatérési paraméterek | Tilos közvetlenül használni a HashMapet és a HashTable-t a lekérdezés eredményhalmazának kimeneteként. Ok: Az attribútumérték típusa irányíthatatlan. | kényszerítve |
| | sql.xml Paraméterek konfigurálása | sql.xml Használd a #{}, #param# konfigurációs paramétereket, és ne használd a ${}-t, mivel a ${} hajlamos az SQL befecskendezésre. | kényszerítve |
| | queryForList | A Mybatishoz tartozó queryForList (String statementName, int start, int size) használata tilos. Ok: Úgy valósítják meg, hogy az adatbázisban található összes SQL utasítás rekordját letöltik, amely a statementName-hez felel meg, majd a subList-et használva megkapjuk a start, size részhalmazát. | kényszerítve |
| | Frissítési idő | Egy adatbázistábla rekord frissítésekor ugyanabban az időben kell frissítened a rekord módosítási idejét is. | kényszerítve |
| | Adatbázis-tábla rekordok frissítése | Ne írj egy nagy és teljes adatfrissítési interfészt (POJO osztályként adják be). SQL futtatásakor ne frissítsd a változtatatlan mezőket a hibahajlamos, hatékonytalan és megnövekedett binlog tárolás miatt. | ajánl |
| | @Transactional | @Transactional Ne bántsd vissza a tranzakciókat. A tranzakciók befolyásolják az adatbázis QPS-jét. Ezen túlmenően, amikor tranzakciókat használsz, figyelembe kell venni a visszafordítási sémák különböző aspektusait, beleértve a cache rollback-et, keresőmotor-visszagörgetést, üzenetkompenzációt, statisztikai korrekciót stb. | utalás |
| | Mybatis dinamikus SQL címkék | < compareValue az isEqual-ban> egy állandó az attribútumértékhez képest, általában egy szám, ami azt jelzi, hogy a megfelelő SQL utasítást akkor hajtják végre, amikor egyenlő; < isNotEmpty> azt jelzi, hogy akkor hajtják végre, ha nem üres és nem null; < isNotNull> azt jelzi, hogy akkor hajtják végre, amikor nem null. | utalás | |
|