Gute Datenbankspezifikationen tragen dazu bei, die Komplexität der Softwareimplementierung zu verringern und die Kommunikationskosten zu senken. Diese eiserne Regel umfasst hauptsächlich die Verarbeitungskonventionen beim Erstellen von Datenbanken und Tabellen, beim Erstellen von Indizes, beim Schreiben von SQL, beim ORM-Mapping usw. 1. Das Eiserne Gesetz der Datenbankkonstruktion - | Eiserne Regel | Ebene | Bemerkung |
---|
Zeichensatz | Verwenden Sie UTF-8. Wenn Sie Ausdrücke speichern, verwenden Sie utf8mb4 zur Speicherung. | Durchsetzung | | Sortierregeln | Verwenden von utf8_general_ci | Durchsetzung | |
2. Die eiserne Regel der Tabellenerstellung - | Eiserne Regel | Ebene | Bemerkung |
---|
Hinweise | Feldanmerkungen sind ein Muss. | Durchsetzung | | Kodierung | Verwenden Sie UTF-8. Wenn Sie Ausdrücke speichern, verwenden Sie utf8mb4 zur Speicherung. | Durchsetzung | | Ob das Begriffsfeld | Muss is_xx heißen, der Datentyp ist vorzeichenloser Tinyint (1 für ja, 0 für nein), zum Beispiel is_deleted (1 für gelöscht, 0 für nicht gelöscht). | Durchsetzung | Jedes Feld muss vorzeichenlos sein, wenn es nicht negativ ist. | Tabellenname, Feldname | Es dürfen nur Kleinbuchstaben, Unterstriche oder Zahlen verwendet werden. Der Name darf nicht mit einem Unterstrich oder einer Zahl beginnen. Zwischen zwei Unterstrichen dürfen nicht nur Zahlen stehen. Reservierte Wörter sind nicht zulässig. Tabellennamen dürfen keine Nomen im Plural enthalten. | Durchsetzung | | Benennung von Datenbank- und Tabellennamen | Der Bibliotheksname sollte möglichst mit dem Anwendungsnamen übereinstimmen und der Tabellenname sollte mit der Funktion „Geschäftsname_Tabelle“ benannt werden. | Durchsetzung | | Indexbenennung | Der Primärschlüsselindex verwendet den pk_field-Namen; der eindeutige Index verwendet den uk_field-Namen; der gemeinsame Index verwendet den idx_field-Namen. | Durchsetzung | pk_ ist der Primärschlüssel; uk_ ist der eindeutige Schlüssel; idx_ ist der Index | Dezimaltyp | Der Datentyp ist dezimal. Float und Double sind verboten. Float und Double haben einen Genauigkeitsverlust. Wenn der gespeicherte Datenbereich den Dezimalbereich überschreitet, wird empfohlen, die Daten in Ganzzahlen und Dezimalzahlen aufzuteilen und diese separat zu speichern. | Durchsetzung | | varchar-Typ | varchar ist eine Zeichenfolge mit variabler Länge, die keinen Speicherplatz vorab zuweist und nicht länger als 5.000 Zeichen sein sollte. Wenn die Länge 5.000 überschreitet, verwenden Sie Text (erstellen Sie eine separate Tabelle und verwenden Sie den entsprechenden Primärschlüssel, um die Indexeffizienz anderer Felder nicht zu beeinträchtigen). | Durchsetzung | | Der Tabellenname muss drei Felder haben | id (Datentyp ist vorzeichenloser Bigint, einzelnes Tabelleninkrement, Schrittgröße ist 1), gmt_create, gmt_modified (aktive Erstellungszeit, passive Aktualisierungszeit, Datentyp ist datetime). | Durchsetzung | | Feldredundanz | Felder dürfen angemessen redundant sein, aber die Datenkonsistenz muss berücksichtigt werden. Redundante Felder sollten 1) nicht häufig geändert werden; 2) keine VarChar-Ultralangfelder sein, geschweige denn Textfelder. | empfehlen | | Unterbibliothek und Untertisch | Es wird empfohlen, die Datenbank und Tabellen nur dann zu teilen, wenn die Anzahl der Zeilen in einer einzelnen Tabelle 5 Millionen überschreitet oder die Kapazität einer einzelnen Tabelle 2 GB überschreitet. | empfehlen | |
Durch Festlegen einer geeigneten Zeichenspeicherlänge können Sie nicht nur Datenbanktabellenspeicherplatz und Indexspeicher sparen, sondern – was noch wichtiger ist – die Abrufgeschwindigkeit verbessern. 3. Die eiserne Regel der Indizierung - | Eiserne Regel | Ebene | Bemerkung |
---|
Eindeutiger Index | Felder, die im betriebswirtschaftlichen Sinne eindeutig sind, müssen eindeutig indexiert werden, auch wenn es sich um die Kombination mehrerer Felder handelt. Obwohl der eindeutige Index die Einfügegeschwindigkeit beeinflusst, kann dieser Verlust ignoriert werden, verbessert aber die Abfragegeschwindigkeit erheblich. Darüber hinaus werden, selbst wenn auf der Anwendungsebene eine sehr umfassende Überprüfungskontrolle durchgeführt wird, gemäß Murphys Gesetz zwangsläufig fehlerhafte Daten generiert, solange kein eindeutiger Index vorhanden ist. | Durchsetzung | | verbinden | Es ist verboten, mehr als drei Tabellen zu verknüpfen. Die Datentypen der zu verknüpfenden Felder müssen konsistent sein. Achten Sie bei der Abfrage mehrerer Tabellen darauf, dass die verknüpften Felder Indizes haben. Achten Sie auch beim Verknüpfen zweier Tabellen auf Tabellenindizes und SQL-Performance. | Durchsetzung | | Erstellen eines Indexes für ein VARCHAR-Feld | Die Indexlänge muss angegeben werden. Es ist nicht notwendig, das gesamte Feld zu indizieren. Die Indexlänge kann anhand der tatsächlichen Textdifferenzierung bestimmt werden. Indexlänge und Diskrimination sind widersprüchlich. Im Allgemeinen beträgt die Diskrimination eines Indexes mit einer Länge von 20 bei Stringdaten 90 % oder mehr. Sie können count(distinct left(column name, index length))/count(*) verwenden, um die Diskrimination zu bestimmen. | Durchsetzung | | Seitensuche verhindert Unschärfe | Die Seitensuche kann nicht unscharf oder vollständig unscharf gelassen werden. Verwenden Sie bei Bedarf die Suchmaschine, um das Problem zu lösen. Verbotsgrund: Die Indexdatei verfügt über die am weitesten links stehende Präfixübereinstimmungsfunktion von B-Tree. Wenn der Wert auf der linken Seite nicht bestimmt wird, kann dieser Index nicht verwendet werden. | Durchsetzung | | Bestellen bis | Wenn ein Order-by-Szenario vorliegt, achten Sie bitte auf die Reihenfolge des Index. Das letzte Feld in „Sort by“ ist Teil des zusammengesetzten Index und wird am Ende der zusammengesetzten Indexreihenfolge platziert, um File_Sort-Situationen zu vermeiden, die die Abfrageleistung beeinträchtigen. Positives Beispiel: wobei a=? und b=? nach c sortiert ist; der Index sollte als a_b_c erstellt werden; Negatives Beispiel: Wenn im Index eine Bereichssuche vorhanden ist, kann die Indexreihenfolge nicht verwendet werden, z. B. wobei a>10 nach b sortiert ist; der Index a_b kann nicht sortiert werden. | empfehlen | |
4. Die eiserne Regel beim Schreiben von SQL - | Eiserne Regel | Ebene | Bemerkung |
---|
zählen(*) | Verwenden Sie nicht count(Spaltenname) oder count(Konstante) anstelle von count(*). Count(*) ist die Standardsyntax zum Zählen von Zeilen, die in SQL92 definiert ist. Sie hat nichts mit der Datenbank zu tun und hat nichts mit NULL oder Nicht-NULL zu tun. count(*) zählt die Zeilen, deren Werte NULL sind, während count(Spaltenname) die Zeilen nicht zählt, deren Werte NULL sind. | Durchsetzung | | Anzahl (unterschiedliche Spalten) | Zählt die Anzahl der eindeutigen Zeilen in dieser Spalte ohne NULL. Beachten Sie, dass count(distinct col1, col2) 0 zurückgibt, wenn eine der Spalten vollständig NULL ist, selbst wenn die andere Spalte unterschiedliche Werte hat. | Durchsetzung | | Summe(Spalte) | Wenn alle Werte in einer Spalte 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 achten. Sie können das NPE-Problem vermeiden, indem Sie der folgenden Methode folgen: select if(isnull(sum(g)), 0, sum(g)) from table; | Durchsetzung | | ist null | Verwenden Sie isnull(), um zu überprüfen, ob es sich um einen NULL-Wert handelt. NULL ist mit jedem beliebigen Wert vergleichbar. | Durchsetzung | | Paging-Abfragelogik | Wenn die Anzahl 0 ist, sollte direkt zurückgekehrt werden, um die Ausführung der nachfolgenden Paging-Anweisungen zu vermeiden. | Durchsetzung | | Fremdschlüssel und Kaskadierung | Fremdschlüssel und Kaskaden sind verboten und alle Fremdschlüsselkonzepte müssen auf der Anwendungsebene aufgelöst werden. Grund: Fremdschlüssel und Kaskaden sind für verteilte Cluster mit hoher Parallelität nicht geeignet. Kaskadenaktualisierungen werden stark blockiert und es besteht die Gefahr von Datenbankaktualisierungsstürmen. Fremdschlüssel beeinträchtigen die Einfügegeschwindigkeit der Datenbank. | Durchsetzung | | Gespeicherte Prozeduren | Die Verwendung gespeicherter Prozeduren ist verboten. Gespeicherte Prozeduren sind schwer zu debuggen und zu erweitern und nicht portierbar. | Durchsetzung | | Datenkorrektur | Beim Korrigieren von Daten (insbesondere beim Löschen oder Ändern von Datensätzen) müssen Sie zuerst eine Auswahl treffen, um ein versehentliches Löschen zu vermeiden, und die Aktualisierungsanweisung erst ausführen, nachdem Sie bestätigt haben, dass alles korrekt ist. | Durchsetzung | | In | Vermeiden Sie nach Möglichkeit den in-Vorgang. Wenn dies nicht vermieden werden kann, sollte die Anzahl der Elemente in der Sammlung nach in auf 1000 begrenzt werden. | empfehlen | | Tabelle abschneiden | Verwenden Sie Truncate Table nicht. Truncate Table ist schneller als Delete und verbraucht weniger System- und Protokollressourcen. Truncate hat jedoch keine Transaktion und löst keinen Trigger aus, was zu einem Unfall führen kann. Verwenden Sie diese Anweisung daher nicht im Entwicklungscode. | siehe | |
5. Das Eiserne Gesetz des ORM-Mappings - | Eiserne Regel | Ebene | Bemerkung |
---|
Tabellenabfrage | Es ist verboten, * als Feldliste für die Abfrage zu verwenden. Die erforderlichen Felder müssen leer sein. | Durchsetzung | | POJO | Das Boolesche Attribut der POJO-Klasse kann nicht mit is hinzugefügt werden, aber das Datenbankfeld muss mit is hinzugefügt werden, was eine Zuordnung zwischen Feldern und Attributen in resultMap erfordert. | Durchsetzung | | Rückgabeparameter | Es ist verboten, resultClass als Rückgabeparameter zu verwenden. Auch wenn alle Klassenattributnamen eins zu eins mit Datenbankfeldern übereinstimmen, müssen sie dennoch definiert werden; umgekehrt muss jede Tabelle ein entsprechendes Attribut haben. Grund: Konfigurieren Sie die Zuordnungsbeziehung, um das Feld zur einfacheren Wartung mit der DO-Klasse zu koppeln. | Durchsetzung | | Rückgabeparameter | Es ist verboten, HashMap oder HashTable direkt als Ausgabe des Abfrageergebnissatzes zu verwenden. Ursache: Der Typ des Attributwertes ist nicht steuerbar. | Durchsetzung | | sql.xml-Konfigurationsparameter | Verwenden Sie #{}, #param# für sql.xml-Konfigurationsparameter. Verwenden Sie nicht ${}, da ${} anfällig für SQL-Injection ist. | Durchsetzung | | Abfrage für Liste | Es ist verboten, die von Mybatis bereitgestellte Funktion queryForList(String statementName, int start, int size) zu verwenden. Grund: Die Implementierungsmethode besteht darin, alle Datensätze der SQL-Anweisung abzurufen, die dem Anweisungsnamen in der Datenbank entsprechen, und dann die Untersammlung von Start und Größe über die Unterliste abzurufen. | Durchsetzung | | Letztes Update | Beim Aktualisieren eines Datenbanktabellendatensatzes muss gleichzeitig die Änderungszeit des Datensatzes aktualisiert werden. | Durchsetzung | | Aktualisieren Sie die Datensätze der Datenbanktabelle | Schreiben Sie keine große und umfassende Schnittstelle zur Datenaktualisierung (übergeben Sie eine POJO-Klasse). Aktualisieren Sie beim Ausführen von SQL keine unveränderten Felder. Gründe: Es ist fehleranfällig, ineffizient und erhöht den Binlog-Speicher. | empfehlen | | @Transaktional | Missbrauchen Sie @Transactional-Transaktionen nicht. Transaktionen wirken sich auf die QPS der Datenbank aus. Darüber hinaus müssen bei der Verwendung von Transaktionen verschiedene Rollback-Lösungen in Betracht gezogen werden, darunter Cache-Rollback, Suchmaschinen-Rollback, Nachrichtenkompensation, statistische Korrektur usw. | siehe | | Dynamische SQL-Tags von Mybatis | Der compareValue in <isEqual> ist eine Konstante, die mit dem Attributwert, normalerweise einer Zahl, verglichen wird, was bedeutet, dass die entsprechende SQL-Anweisung ausgeführt wird, wenn sie gleich sind; <isNotEmpty> bedeutet, dass es ausgeführt wird, wenn es nicht leer und nicht null ist; <isNotNull> bedeutet, dass es ausgeführt wird, wenn es nicht null ist. | siehe | |
Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird. Das könnte Sie auch interessieren:- Detaillierte Erläuterung des Befehls zum Bereinigen des MySQL-Datenbank-Binlogs
- So vergleichen Sie zwei Datenbanktabellenstrukturen in MySQL
- Beispiel zum Überprüfen der Kapazität einer MySQL-Datenbanktabelle
- Vorgehensweise bei der Verwendung der MySQL-Systemdatenbank zur Diagnose der Leistungsbelastung
- MySQL-Datenbank erstellen, Benutzer hinzufügen, Benutzerautorisierung, praktische Methode
|