Eine gute Datenbankspezifikation hilft, die Komplexität der Softwareimplementierung zu reduzieren und die Kommunikationskosten zu senken.
1. Das eiserne Gesetz des Baus eines Lagerhauses
- | Eisengesetz | Level | Bemerkung | Zeichensatz | Benutze UTF-8. Wenn das Emoji gespeichert ist, nutze utf8mb4 zur Speicherung. | Zwang |
| | Sortierregeln | Nutzen Sie utf8_general_ci | Zwang | |
2. Das eiserne Gesetz des Tischbaus
- | Eisengesetz | Level | Bemerkung | Exegese | Stellen Sie sicher, dass Sie Feldanmerkungen haben. | Zwang |
| | kodieren | Benutze UTF-8. Wenn das Emoji gespeichert ist, nutze utf8mb4 zur Speicherung. | Zwang |
| | ob das Feld konzeptuell ist | Sie muss mit is_xx benannt sein, und der Datentyp ist unsigned tinyint(1 ja, 0 no), z. B. is_deleted(1 delete, 0 nicht gelöscht). | Zwang | Jeder Körper muss unsigniert sein, sofern er nicht negativ ist | Tabellenname, Feldname | Es dürfen nur Kleinbuchstaben, Unterstriche oder Zahlen verwendet werden; Es ist verboten, mit einer Unterstrich oder Zahl zu beginnen; Nur Zahlen zwischen zwei Unterstrichen sind verboten; Reservierte Wörter deaktivieren; Die Verwendung von Plural-Substantiven ist in Tabellennamen verboten. | Zwang |
| | Die Benennung des Datenbank- und Tabellennamens | Der Datenbankname sollte mit dem Anwendungsnamen übereinstimmen, und der Tabellenname sollte mit Business Name_Role der Tabelle benannt sein. | Zwang |
| | Indexbenennung | Der Primärschlüsselindex verwendet pk_ Feldnamen; Eindeutiger Index mit uk_ Feldnamen; Normale Indizes verwenden idx_ Feldnamen. | Zwang | pk_ ist der Primärschlüssel; uk_ ist ein einzigartiger Schlüssel; idx_ ist Index | Dezimaltyp | Der Datentyp ist dezimal, und die Verwendung von Float und Double ist verboten; Float und Double haben Präzisionsverlust, und wenn der gespeicherte Datenbereich den Dezimalbereich überschreitet, wird empfohlen, die Daten in ganze Zahlen und Dezimalzahlen aufzuteilen und separat zu speichern. | Zwang |
| | Varchar-Typ | Varchar ist ein variabel langer String, kein Speicherplatz wird im Voraus zugewiesen, die Länge darf 5000 Zeichen nicht überschreiten, wenn die Länge größer als 5000 ist, wird Text angewendet (eine separate Tabelle erstellt, mit dem Primärschlüssel entsprechend verwendet, um die Indexierungseffizienz anderer Felder nicht zu beeinträchtigen). | Zwang |
| | Im Tabellennamen müssen drei Felder enthalten sein | id (Datentyp ist unsigned bigint, Single Table Increment, Schrittgröße 1), gmt_create, gmt_modified (aktive Erstellungszeit, passive Aktualisierungszeit, Datentyp ist Datetime). | Zwang |
| | Feldredundanz | Felder ermöglichen angemessene Redundanz, aber Datenkonsistenz muss berücksichtigt werden, und redundante Felder sollten 1) seltene Änderungen aufweisen; 2) Kein Varchar-Super-Langfeld, geschweige denn ein Textfeld. | Empfehlen |
| | Teile die Datenbank und Tabellen auf | Partitionierung wird nur empfohlen, wenn die Anzahl der Zeilen in einer einzelnen Tabelle 5 Millionen Zeilen übersteigt oder die Kapazität einer einzelnen Tabelle 2 GB übersteigt. | Empfehlen | |
Die Einstellung der passenden Speicherlänge für Zeichen spart nicht nur Speicherplatz in Datenbanktabellen und Indexspeicher, sondern verbessert vor allem die Abrufgeschwindigkeit.
3. Ein Index-Eisen-Gesetz festlegen
- | Eisengesetz | Level | Bemerkung | Einzigartiger Index | Bereiche mit einzigartigen Merkmalen im Unternehmen, selbst wenn sie eine Kombination von Bereichen sind, müssen eindeutig indexiert werden. Obwohl der eindeutige Index die Einfügungsgeschwindigkeit beeinflusst, ist dieser Verlust vernachlässigbar, verbessert jedoch die Abfragegeschwindigkeit erheblich. Außerdem werden selbst wenn die Anwendungsschicht eine sehr vollständige Kontrolle hat, solange es keinen eindeutigen Index gibt, laut Murphys Gesetz zwangsläufig unsaubere Daten erzeugt. | Zwang |
| | Beitreten | Mehr als drei Tabellen verbieten Joining, Felder, die Join erfordern, und die Datentypen müssen konsistent sein; Wenn mehrere Tabellen mit Abfragen verknüpft sind, stellen Sie sicher, dass die zugehörigen Felder einen Index benötigen. Auch wenn du einen doppelten Tabellen-Join hast, achte auf die Tabellenindexierung und die SQL-Performance. | Zwang |
| | Varcharfield | Die Indexlänge muss angegeben werden, und es ist nicht notwendig, alle Felder zu indexieren, sondern nur die Indexlänge entsprechend der tatsächlichen Textunterscheidung zu bestimmen. Indexlänge und Unterscheidung sind ein Paar von Widersprüchen; im Allgemeinen haben Indizes mit einer Länge von 20 einen Unterscheidungsgrad von mehr als 90 %, der durch den Unterscheidungsgrad von Count(distinct left(Spaltenname, Indexlänge))/Count(*) bestimmt werden kann. | Zwang |
| | Unschärfe ist bei der Seitensuche verboten | Die Seitensuche verbietet Unschärfe oder vollständige Unschärfe, falls nötig, geh bitte in die Suchmaschine, um das Problem zu lösen. Prohibitionsgrund: Die Indexdatei hat die linke Präfix-Match-Eigenschaft des B-Baums, und wenn der Wert links nicht bestimmt ist, kann dieser Index nicht verwendet werden. | Zwang |
| | Ordnung nach | Wenn es eine Reihenfolge nach Szenario gibt, achte auf die Ordnung des Indexes. Das letzte Feld der Ordnung nach ist Teil des kombinierten Index und wird am Ende der Indexkombinationsreihenfolge platziert, um file_sort zu vermeiden und die Abfrageleistung zu beeinträchtigen. Beispiel: wo a=? und b=? Ordnung nach C; Der Index sollte wie a_b_c aufgebaut werden; Gegenbeispiel: Wenn es eine Bereichssuche im Index gibt, kann die Indexordnung nicht genutzt werden, etwa wenn a>10 durch b geordnet ist; Index a_b kann nicht sortiert werden. | Empfehlen | |
4. SQL-Eisenregeln schreiben
- | Eisengesetz | Level | Bemerkung | Zähl(*) | Verwenden Sie nicht count(Spaltenname) oder count(constant) statt count(*), das ist die Syntax für die Standardanzahl der von SQL92 definierten Zeilen, unabhängig von der Datenbank und unabhängig von NULL und nicht-NULL. count(*) zählt Zeilen mit einem NULL-Wert, während count(Spaltenname) keine Zeilen mit dieser Spalte NULL zählt. | Zwang |
| | Graf (besonderer Koll) | Zählt die Anzahl der eindeutigen Zeilen in der Spalte, außer NULL. Beachte, dass Count (unterschiedliche Kol1, Kol2), wenn eine der Spalten alle NULL ist, sie 0 zurückgibt, selbst wenn die andere Spalte einen anderen Wert hat. | Zwang |
| | sum(kol) | Wenn die Werte einer Spalte alle NULL sind, gibt count(col) 0 zurück, aber sum(col) gibt NULL zurück, daher müssen Sie bei der Verwendung von sum() auf NPE-Probleme achten. NPE-Probleme können auf folgende Weise vermieden werden: Auswahl if(isnull(sum(g)), 0, sum(g)) aus der Tabelle; | Zwang |
| | isnull | Verwenden Sie isnull(), um zu bestimmen, ob es sich um einen NULL-Wert handelt. NULL ist NULL im Vergleich zu jedem beliebigen Wert. | Zwang |
| | Paginations-Abfragelogik | Ist der Count 0, sollte er direkt zurückgegeben werden, um die Ausführung der nachfolgenden Paginierungsanweisung zu vermeiden. | Zwang |
| | Äußere Schlüssel und Kaskaden | Die Verwendung von Fremdschlüsseln und Kaskadieren, und alle Fremdschlüsselkonzepte müssen auf der Anwendungsebene gelöst werden. Begründung: Fremdschlüssel und Kaskaden sind für verteilte, hochzeitige Cluster nicht geeignet, kaskadierende Updates sind starke Blockierungen, es besteht das Risiko von Datenbank-Aktualisierungsstürmen und Fremdschlüssel beeinflussen die Einfügungsgeschwindigkeit der Datenbank. | Zwang |
| | Gespeicherte Verfahren | Gespeicherte Prozeduren sind verboten, gespeicherte Prozeduren sind schwer zu debuggen und skalierbar und nicht portabel. | Zwang |
| | Datenkorrektur | Beim Korrekturen von Daten (insbesondere beim Löschen oder Ändern von Datensätzen) wählen Sie zuerst, um eine versehentliche Löschung zu vermeiden, und führen Sie die Aktualisierungsanweisung erst nach Bestätigung der Korrektheit aus. | Zwang |
| | in | Wenn es nicht vermieden werden kann, sollte die Anzahl der gesetzten Elemente nach in innerhalb von 1000 kontrolliert werden. | Empfehlen |
| | Trunkiert-Tabelle | Es ist verboten, die Tabelle zu truncieren, da sie schneller ist als Delete und weniger System- und Logressourcen benötigt, aber Truncate ist transaktionsfrei und löst keine Trigger aus, die Unfälle verursachen können, daher sollten Sie diese Anweisung nicht im Entwicklungscode verwenden. | Referenz |
|
5. ORM bildet eiserne Gesetze ab
| - | Eisengesetz | Level | Bemerkung | Tabellenabfrage | Die Liste der Felder, die für Abfragen verboten sind, * zu verwenden, muss klar sein, welche Felder erforderlich sind. | Zwang |
| | POJO | Das Boolesche Attribut der POJO-Klasse kann nicht zu is hinzugefügt werden, während das Datenbankfeld zu is hinzugefügt werden muss, was eine Abbildung zwischen Feldern und Attributen im resultMap erfordert. | Zwang |
| | Rückgabeparameter | Es ist verboten, resultClass als Rückgabeparameter zu verwenden, selbst wenn alle Klassenattributnamen einzeln Datenbankfeldern entsprechen, müssen sie definiert werden; Jede Tabelle muss wiederum ein entsprechendes Attribut besitzen. Grund: Konfigurieren Sie die Mapping-Beziehung so, dass das Feld mit der DO-Klasse gekoppelt wird, um die Wartung zu erleichtern. | Zwang |
| | Rückgabeparameter | Es ist verboten, HashMap und HashTable direkt als Ausgabe der Abfrageergebnismenge zu verwenden. Begründung: Der Attributtyp ist unkontrollierbar. | Zwang |
| | sql.xml Parameter konfigurieren | sql.xml Verwenden Sie #{}, #param# für Konfigurationsparameter und verwenden Sie nicht ${}, da ${} anfällig für SQL-Injektionen ist. | Zwang |
| | queryForList | Die Verwendung von queryForList (String statementName, int start, int size), die mit Mybatis geliefert wird, ist verboten. Reason: Es wird implementiert, indem alle Datensätze der SQL-Anweisung, die dem StatementName entspricht, in der Datenbank abgerufen und dann die SubList verwendet wird, um eine Teilmenge von Startgröße zu erhalten. | Zwang |
| | Aktualisierungszeit | Beim Aktualisieren eines Datenbanktabellendatensatzes müssen Sie gleichzeitig die Änderungszeit des Datensatzes aktualisieren. | Zwang |
| | Datenbanktabellendatensätze aktualisieren | Schreibe keine große und vollständige Daten-Update-Oberfläche (als POJO-Klasse übergeben). Beim Ausführen von SQL sollten unveränderte Felder aufgrund fehleranfälliger, ineffizienter und erhöhter Binlog-Speicherkapazität nicht aktualisiert werden. | Empfehlen |
| | @Transactional | @Transactional Missbrauche keine Transaktionen. Transaktionen beeinflussen die QPS der Datenbank. Außerdem müssen Sie bei Verwendung von Transaktionen verschiedene Aspekte von Rollback-Schemata berücksichtigen, darunter Cache-Rollback, Suchmaschinen-Rollback, Nachrichtenkompensation, statistische Korrekturen usw. | Referenz |
| | Mybatis dynamische SQL-Tags | < compareValue in isEqual> ist eine Konstante im Vergleich zum Attributwert, meist eine Zahl, die anzeigt, dass die entsprechende SQL-Anweisung ausgeführt wird, wenn sie gleich ist; < isNotEmpty> zeigt an, dass es ausgeführt wird, wenn es nicht leer und nicht null ist; < isNotNull> zeigt an, dass es ausgeführt wird, obwohl es nicht null ist. | Referenz | |
|