Une bonne spécification de base de données aide à réduire la complexité de la mise en œuvre logicielle et à diminuer les coûts de communication.
1. La loi de fer de la construction d’un entrepôt
- | Loi de fer | Niveau | remarque | Jeu de caractères | Utilise l’UTF-8. Si l’emoji est stocké, utilisez utf8mb4 pour le stockage. | forcée |
| | Règles de tri | Utilisez utf8_general_ci | forcée | |
2. La loi de fer de la construction de tables
- | Loi de fer | Niveau | remarque | exégèse | Assurez-vous d’avoir des annotations sur le terrain. | forcée |
| | encoder | Utilise l’UTF-8. Si l’emoji est stocké, utilisez utf8mb4 pour le stockage. | forcée |
| | si le champ est conceptuel | Il doit être nommé par is_xx, et le type de données est unsigned tinyint (1 oui, 0 non), par exemple is_deleted(1 supprimé, 0 non supprimé). | forcée | Tout champ doit être sans signe s’il n’est pas négatif | Nom du tableau, nom du champ | Seules les lettres minuscules, les sous-points ou les chiffres peuvent être utilisés ; Il est interdit de commencer par un soulignement ou un chiffre ; Seuls les numéros sont interdits entre deux underlines ; Désactiver les mots réservés ; L’utilisation de noms pluriels est interdite dans les noms des tableaux. | forcée |
| | La dénomination du nom de la base de données et du nom de la table | Le nom de la base de données doit être cohérent avec le nom de l’application, et le nom de la table doit être nommé avec Name_Role Business de la table. | forcée |
| | Dénomination des indices | L’index principal utilise pk_ nom de champ ; Index unique avec uk_ nom de champ ; Les index normaux utilisent idx_ noms de champs. | forcée | pk_ est la clé primaire ; uk_ est une tonalité unique ; idx_ est l’index | Type décimal | Le type de données est décimal, et l’utilisation de float et double est interdite, float et double subissent une perte de précision, et si la plage de données stockées dépasse celle de décimal, il est recommandé de diviser les données en entiers et décimaux et de les stocker séparément. | forcée |
| | Type Varchar | varchar est une chaîne variable longue, aucun espace de stockage n’est alloué à l’avance, la longueur ne doit pas dépasser 5000 caractères, si la longueur est supérieure à 5000, appliquer du texte (créer un tableau séparé, utiliser la clé primaire pour correspondre, afin d’éviter d’affecter l’efficacité d’indexation des autres champs). | forcée |
| | Il doit y avoir trois champs dans le nom du tableau | ID (le type de données est bigint non signé, incrément de table unique, taille de pas 1), gmt_create, gmt_modified (temps de création active, temps de mise à jour passive, type de données est datetime). | forcée |
| | Redondance de champ | Les champs permettent une redondance appropriée, mais la cohérence des données doit être prise en compte, et les champs redondants doivent avoir 1) des modifications peu fréquentes ; 2) Pas un champ très long de Varchar, encore moins un champ de texte. | Recommander |
| | Divisez la base de données et les tables | Le partitionnement n’est recommandé que lorsque le nombre de lignes dans une seule table dépasse 5 millions de lignes ou que la capacité d’une seule table dépasse 2 Go. | Recommander | |
Définir la longueur de stockage appropriée des caractères permet non seulement d’économiser de l’espace dans les tables de base de données et de l’index, mais surtout, d’améliorer la vitesse de récupération.
3. Établir une loi de fer indiciel
- | Loi de fer | Niveau | remarque | Indice unique | Les domaines ayant des caractéristiques uniques dans l’entreprise, même s’ils sont une combinaison de champs, doivent être indexés de manière unique. Bien que l’indice unique affecte la vitesse d’insertion, cette perte est négligeable, mais elle améliore significativement la vitesse de requête. De plus, même si la couche application dispose d’un contrôle de contrôle très complet, tant qu’il n’y a pas d’indice unique, selon la loi de Murphy, des données compromettantes seront inévitablement générées. | forcée |
| | Rejoins | Plus de trois tables interdisent la jointure, les champs nécessitant la jointure, et les types de données doivent être cohérents ; Lorsque plusieurs tables sont associées aux requêtes, assurez-vous que les champs associés doivent comporter un index. Même si vous avez une double jointure de table, faites attention à l’indexation des tables, aux performances SQL. | forcée |
| | Varcharfield | La longueur de l’index doit être spécifiée, et il n’est pas nécessaire d’indexer tous les champs, il suffit de déterminer la longueur de l’index selon la distinction réelle du texte. La longueur et la distinction de l’indice sont une paire de contradictions ; généralement, pour les données de type de chaîne, les indices de longueur 20 auront un degré de distinction supérieur à 90 %, déterminé par le degré de distinction de count(distinct left(nom de colonne, longueur d’index)))/count(*). | forcée |
| | Le flou est interdit lors de la recherche de pages | La recherche de page interdit le floutage ou le floutage complet ; si nécessaire, veuillez consulter le moteur de recherche pour résoudre le problème. Raison d’interdiction : Le fichier index possède la propriété de correspondance du préfixe le plus à gauche de l’arbre B, et si la valeur à gauche n’est pas déterminée, alors cet index ne peut pas être utilisé. | forcée |
| | Ordre par | S’il existe un ordre par scénario, faites attention à l’ordre de l’index. Le dernier champ d’ordre par fait partie de l’index combiné et est placé à la fin de l’ordre de combinaison de l’indice afin d’éviter file_sort et d’affecter la performance des requêtes. Exemple : où a= ? et b= ? ordre par c ; L’indice doit être construit comme a_b_c ; Contre-exemple : s’il y a une recherche de plage dans l’index, alors l’ordre de l’indice ne peut pas être utilisé, comme lorsque a>10 ordre par b ; L’index a_b ne peut pas être trié. | Recommander | |
4. Écrire des règles SQL
- | Loi de fer | Niveau | remarque | count(*) | N’utilisez pas count(nom de colonne) ou count(constant) au lieu de count(*), qui est la syntaxe du compte standard de lignes défini par SQL92, indépendante de la base de données, et indépendante de NULL et non-NULL. count(*) compte les lignes avec une valeur NULL, tandis que count(nom de colonne) ne compte pas les lignes avec cette colonne NULL. | forcée |
| | Comte (col distinct) | Compte le nombre de lignes uniques dans la colonne sauf NULL. Notez que compter (distinct col1, col2), si l’une des colonnes est entièrement NULL, alors elle retourne 0 même si l’autre colonne a une valeur différente. | forcée |
| | Sum(col) | Lorsque les valeurs d’une colonne sont toutes NULL, count(col) retourne 0, mais sum(col) retourne NULL, donc il faut être conscient des problèmes NPE lorsque vous utilisez sum(). Les problèmes NPE peuvent être évités des manières suivantes : sélectionner if(isnull(sum(g)), 0, sum(g)) à partir du tableau ; | forcée |
| | isnull | Utilisez isnull() pour déterminer s’il s’agit d’une valeur NUL. NULL est NULL comparé à n’importe quelle valeur. | forcée |
| | Logique de requête par pagination | Si le compte est à 0, il doit être retourné directement pour éviter d’exécuter l’instruction de pagination suivante. | forcée |
| | Tonalités extérieures et cascades | L’utilisation de clés étrangères et de cascade est interdite, et tous les concepts de clés étrangères doivent être résolus au niveau applicatif. Raison : Les clés étrangères et les cascades ne conviennent pas aux clusters distribués à forte concurrence, les mises à jour en cascade bloquent fortement, il existe un risque de tempêtes de mises à jour de la base de données, et les clés étrangères affectent la vitesse d’insertion de la base de données. | forcée |
| | Procédures stockées | Les procédures stockées sont interdites, et les procédures stockées sont difficiles à déboguer et à mettre en échelle, et ne sont pas portables. | forcée |
| | Correction des données | Lors de la correction de données (notamment lors de la suppression ou de la modification des enregistrements), sélectionnez d’abord pour éviter la suppression accidentelle, et n’exécutez l’instruction update qu’après avoir confirmé qu’elle est correcte. | forcée |
| | dans | Si cela ne peut pas être évité, le nombre d’éléments de l’ensemble après dans devrait être contrôlé avec un minimum de 1000. | Recommander |
| | Tableau tronqué | Il est interdit d’utiliser la table tronquée, qui est plus rapide que la suppression et utilise moins de ressources système et journalistes, mais tronque est sans transaction et ne déclenche pas de déclencheurs, ce qui peut causer des accidents, donc ne pas utiliser cette instruction dans le code de développement. | référence |
|
5. L’ORM cartographie les lois de fer
| - | Loi de fer | Niveau | remarque | Requête de table | La liste des champs interdits d’utilisation de * pour les requêtes doit être claire sur les champs requis. | forcée |
| | POJO | L’attribut booléen de la classe POJO ne peut pas être ajouté à is, tandis que le champ de base de données doit être ajouté à is, nécessitant une correspondance entre champs et attributs dans le résultMap. | forcée |
| | Paramètres de retour | Il est interdit d’utiliser resultClass comme paramètre de retour, même si tous les noms d’attributs de classe correspondent un par un aux champs de la base de données, ils doivent être définis ; À son tour, chaque table doit avoir un attribut qui lui correspond. Raison : Configurez la relation de cartographie pour coupler le champ avec la classe DO afin d’assurer une maintenance facile. | forcée |
| | Paramètres de retour | Il est interdit d’utiliser directement HashMap et HashTable comme sortie de l’ensemble de résultats de requêtes. Raison : Le type de valeur d’attribut est incontrôlable. | forcée |
| | sql.xml Paramètres de configuration | sql.xml Utilisez #{}, #param# pour les paramètres de configuration, et n’utilisez pas ${}, car ${} est sujet à l’injection SQL. | forcée |
| | queryForList | L’utilisation de queryForList (String statementName, int start, int size) fournie avec Mybatis est interdite. Raison : Il est implémenté en récupérant tous les enregistrements de l’instruction SQL correspondant à statementName dans la base de données, puis en utilisant le sous-List pour obtenir un sous-ensemble de Start, Size. | forcée |
| | Temps de mise à jour | Lors de la mise à jour d’un enregistrement de table de base de données, vous devez mettre à jour le temps de modification de l’enregistrement en même temps. | forcée |
| | Mise à jour des enregistrements de tables de données | N’écrivez pas une interface de mise à jour de données grande et complète (passée comme une classe POJO). Lors de l’exécution de SQL, ne mettez pas à jour les champs inchangés en raison d’un stockage binlog sujet aux erreurs, inefficace et accru. | Recommander |
| | @Transactional | @Transactional N’abuse pas des transactions. Les transactions affectent le QPS de la base de données. De plus, lorsque vous utilisez des transactions, vous devez prendre en compte divers aspects des schémas de rétroaction, notamment le rollback du cache, le rollback des moteurs de recherche, la compensation des messages, la correction statistique, etc. | référence |
| | Balises SQL dynamiques Mybatis | < compareValue dans isEqual> est une constante comparée à la valeur de l’attribut, généralement un nombre, indiquant que l’instruction SQL correspondante est exécutée lorsqu’elle est égale ; < estNotEmpty> indique qu’il est exécuté lorsqu’il n’est ni vide ni nul ; < isNotNull> indique qu’il est exécuté lorsqu’il n’est pas nul. | référence | |
|