Een goede databasespecificatie helpt de complexiteit van software-implementatie te verminderen en de communicatiekosten te verlagen.
1. De ijzeren wet van het bouwen van een pakhuis
- | IJzerwet | Niveau | opmerking | Tekenset | Gebruik UTF-8. Als de emoji is opgeslagen, gebruik dan utf8mb4 voor opslag. | gedwongen |
| | Sorteerregels | Gebruik utf8_general_ci | gedwongen | |
2. De ijzeren wet van tafelconstructie
- | IJzerwet | Niveau | opmerking | exegese | Zorg dat je veldannotaties hebt. | gedwongen |
| | coderen | Gebruik UTF-8. Als de emoji is opgeslagen, gebruik dan utf8mb4 voor opslag. | gedwongen |
| | of het veld conceptueel is | Het moet met is_xx benoemd worden, en het datatype is unsigned tinyint(1 ja, 0 no), bijvoorbeeld is_deleted(1 delete, 0 not deleted). | gedwongen | Elk veld moet onondertekend zijn als het niet negatief is | Tabelnaam, veldnaam | Alleen kleine letters, onderstrepen of cijfers mogen worden gebruikt; Het is verboden om te beginnen met een onderstreep of getal; Alleen nummers zijn verboden tussen twee onderscores; Schakel gereserveerde woorden uit; Het gebruik van meervoudige zelfstandige naamwoorden is verboden in tabelnamen. | gedwongen |
| | De naamgeving van de databasenaam en tabelnaam | De databasenaam moet consistent zijn met de applicatienaam, en de tabelnaam moet worden benoemd met Business Name_Role van de tabel. | gedwongen |
| | Indexnaamgeving | De primaire sleutelindex gebruikt pk_ veldnaam; Unieke index met uk_ veldnaam; Normale indexen gebruiken idx_ veldnamen. | gedwongen | pk_ is de primaire toonsoort; uk_ is unieke sleutel; idx_ is index | Decimale letters | Het datatype is decimaal, en het gebruik van float en double is verboden, float en double hebben precisieverlies, en als het opgeslagen databereik het decimale bereik overschrijdt, wordt aanbevolen de data op te splitsen in gehele getallen en decimalen en deze apart op te slaan. | gedwongen |
| | Varchar-type | Varchar is een variabele lange string, er wordt geen opslagruimte vooraf toegewezen, de lengte mag niet meer dan 5000 tekens bedragen, als de lengte groter is dan 5000, pas dan tekst toe (maak een aparte tabel aan, gebruik de primaire sleutel om te corresponderen, om de indexeringsefficiëntie van andere velden niet te beïnvloeden). | gedwongen |
| | Er moeten drie velden in de tabelnaam staan | ID (datatype is unsigned bigint, enkele tabel increment, stapgrootte is 1), gmt_create, gmt_modified (actieve aanmaaktijd, passieve updatetijd, datatype is datetime). | gedwongen |
| | Veldredundantie | Velden bieden passende redundantie, maar dataconsistentie moet worden overwogen, en redundante velden moeten 1) zelden worden gewijzigd; 2) Geen varchar superlang veld, laat staan een tekstveld. | Aanbevelen |
| | Verdeel de database en tabellen | Partitioneren wordt alleen aanbevolen wanneer het aantal rijen in een enkele tabel meer dan 5 miljoen rijen bedraagt of de capaciteit van een enkele tabel meer dan 2 GB bedraagt. | Aanbevelen | |
Het instellen van de juiste lengte van de tekenopslag bespaart niet alleen ruimte in databasetabellen en indexopslag, maar verbetert vooral de ophaalsnelheid.
3. Stel een indexijzerwet vast
- | IJzerwet | Niveau | opmerking | Unieke index | Velden met unieke kenmerken in het bedrijf, zelfs als het een combinatie van vakgebieden zijn, moeten uniek geïndexeerd zijn. Hoewel de unieke index de invoegsnelheid beïnvloedt, is dit verlies verwaarloosbaar, maar het verbetert de querysnelheid aanzienlijk. Bovendien, zelfs als de applicatielaag zeer volledige controlecontrole heeft, zolang er geen unieke index is, zullen volgens de wet van Murphy onvermijdelijk onbenullige data worden gegenereerd. | gedwongen |
| | Word lid | Meer dan drie tabellen verbieden joining, velden die join vereisen, en de datatypes moeten consistent zijn; Wanneer meerdere tabellen aan queries zijn gekoppeld, zorg er dan voor dat de bijbehorende velden een index moeten hebben. Zelfs als je een dubbele table join hebt, let dan op tabelindexering en SQL-prestaties. | gedwongen |
| | Varcharfield | De indexlengte moet worden gespecificeerd, en het is niet nodig om alle velden te indexeren, alleen de indexlengte te bepalen volgens het daadwerkelijke tekstonderscheid. Indexlengte en onderscheid zijn een paar tegenstrijdigheden; over het algemeen hebben indexen met een lengte van 20 een onderscheidingsgraad van meer dan 90%, wat kan worden bepaald door de onderscheidende graad van count(distinct left(kolomnaam, indexlengte))/count(*). | gedwongen |
| | Vervagen is verboden bij paginazoekopdrachten | Pagina-zoeken verbiedt vervaging of volledige vervaging, indien nodig, ga dan naar de zoekmachine om het op te lossen. Reden voor verbod: Het indexbestand heeft de meest linkse prefix-overeenkomsteigenschap van de B-boom, en als de waarde links niet bepaald is, kan deze index niet worden gebruikt. | gedwongen |
| | Volgorde op | Als er een volgorde per scenario is, let dan op de ordelijkheid van de index. Het laatste veld van order by maakt deel uit van de gecombineerde index en wordt aan het einde van de indexcombinatievolgorde geplaatst om file_sort te voorkomen en de queryprestaties te beïnvloeden. Voorbeeld: waar a=? en b=? volgorde per C; De index moet als a_b_c worden opgebouwd; Tegenvoorbeeld: Als er een bereikzoekopdracht in de index is, kan de ordeloosheid van de index niet worden gebruikt, bijvoorbeeld waar a>10 door b wordt geordend; Index a_b kan niet worden gesorteerd. | Aanbevelen | |
4. Schrijf SQL iron rules
- | IJzerwet | Niveau | opmerking | Telling(*) | Gebruik geen count(kolomnaam) of count(constant) in plaats van count(*), wat de syntaxis is voor het standaardaantal rijen gedefinieerd door SQL92, onafhankelijk van de database, en onafhankelijk van NULL en niet-NULL. count(*) telt rijen met een NULL-waarde, terwijl count(kolomnaam) geen rijen telt met deze kolom NULL. | gedwongen |
| | Graaf (onderscheidend col) | Telt het aantal unieke rijen in de kolom behalve NULL. Let op dat aantal (verschillende kolom 1, kol2), als één van de kolommen allemaal NULL is, deze 0 teruggeeft, zelfs als de andere kolom een andere waarde heeft. | gedwongen |
| | sum(col) | Wanneer de waarden van een kolom allemaal NULL zijn, geeft count(col) 0 terug, maar sum(col) geeft NULL terug, dus je moet alert zijn op NPE-problemen bij het gebruik van sum(). NPE-problemen kunnen op de volgende manieren worden vermeden: selecteer als(isnull(som(g)), 0, som(g)) uit de tabel; | gedwongen |
| | isnull | Gebruik isnull() om te bepalen of het een NULL-waarde is. NULL is NULL vergeleken met elke waarde. | gedwongen |
| | Pagineringsquerylogica | Als de telling 0 is, moet deze direct worden teruggegeven om het uitvoeren van de volgende pagineringsinstructie te voorkomen. | gedwongen |
| | Buitenste sleutels en cascades | Het gebruik van vreemde sleutels en cascadering is verboden, en alle vreemde sleutelconcepten moeten op de applicatielaag worden opgelost. Reden: vreemde sleutels en cascades zijn niet geschikt voor gedistribueerde, hoog-gelijktijdige clusters, cascaderende updates zijn sterke blokkade, er is risico op database-update storms en vreemde sleutels beïnvloeden de invoegsnelheid van de database. | gedwongen |
| | Opgeslagen procedures | Opgeslagen procedures zijn verboden, opgeslagen procedures zijn moeilijk te debuggen en op te schalen, en zijn niet draagbaar. | gedwongen |
| | Gegevenscorrectie | Bij het corrigeren van data (vooral het verwijderen of wijzigen van records), selecteer eerst om per ongeluk verwijdering te voorkomen, en voer de update-instructie pas uit nadat je hebt bevestigd dat deze correct is. | gedwongen |
| | in | Als het niet te vermijden is, moet het aantal set-elementen na in binnen 1000 worden gecontroleerd. | Aanbevelen |
| | Afkaptabel | Het is verboden om de tabel, trupate, te gebruiken, die sneller is dan delete en minder systeem- en logbronnen gebruikt, maar truncate is transactievrij en triggert geen triggers, wat ongelukken kan veroorzaken, dus gebruik deze instructie niet in ontwikkelcode. | referentie |
|
5. ORM kaarten ijzerwetten in kaart
| - | IJzerwet | Niveau | opmerking | Tabelquery | De lijst van velden die * niet mogen gebruiken voor zoekopdrachten moet duidelijk zijn welke velden vereist zijn. | gedwongen |
| | POJO | Het Booleaanse attribuut van de POJO-klasse kan niet worden toegevoegd aan is, terwijl het databaseveld aan is moet worden toegevoegd, wat een mapping vereist tussen velden en attributen in de resultMap. | gedwongen |
| | Retourparameters | Het is verboden resultClass als returnparameter te gebruiken, zelfs als alle klasse-attribuutnamen één voor één overeenkomen met databasevelden, moeten ze worden gedefinieerd; Elke tabel moet op zijn beurt een attribuut hebben dat eraan overeenkomt. Reden: Configureer de mappingrelatie zodat het veld koppelt aan de DO-klasse voor eenvoudig onderhoud. | gedwongen |
| | Retourparameters | Het is verboden om HashMap en HashTable direct te gebruiken als output van de zoekresultatenset. Reden: Het type attribuutwaarde is oncontroleerbaar. | gedwongen |
| | sql.xml Parameters configureren | sql.xml Gebruik #{}, #param# voor configuratieparameters, en gebruik ${} niet, omdat ${} gevoelig is voor SQL-injectie. | gedwongen |
| | queryForList | Het gebruik van queryForList (String statementName, int start, int size) dat bij Mybatis hoort, is verboden. Reason: Het wordt geïmplementeerd door alle records van de SQL-instructie die overeenkomt met statementName in de database op te halen, en vervolgens de subList te gebruiken om een deelset van startgrootte te krijgen. | gedwongen |
| | Updatetijd | Bij het bijwerken van een databasetabelrecord moet je tegelijkertijd de wijzigingstijd van het record bijwerken. | gedwongen |
| | Werk databasetabelrecords bij | Schrijf geen grote en volledige data-update interface (doorgegeven als een POJO-klasse). Bij het uitvoeren van SQL moet je ongewijzigde velden niet bijwerken vanwege foutgevoelige, inefficiënte en verhoogde binlogopslag. | Aanbevelen |
| | @Transactional | @Transactional Maak geen misbruik van transacties. Transacties beïnvloeden de QPS van de database. Daarnaast moet je, waar je transacties gebruikt, rekening houden met verschillende aspecten van rollback-schema's, waaronder cache-rollback, zoekmachine-rollback, berichtcompensatie, statistische correctie, enzovoort. | referentie |
| | Mybatis dynamische SQL-tags | < compareValue in isEqual> is een constante vergeleken met de attribuutwaarde, meestal een getal, wat aangeeft dat de bijbehorende SQL-instructie wordt uitgevoerd wanneer gelijk; < isNotEmpty> geeft aan dat het wordt uitgevoerd wanneer het niet leeg en niet nul is; < isNotNull> geeft aan dat het wordt uitgevoerd wanneer het niet null is. | referentie | |
|