Una buena especificación de base de datos ayuda a reducir la complejidad de la implementación del software y a disminuir los costes de comunicación.
1. La ley de hierro de la construcción de un almacén
- | Ley de hierro | Nivel | comentario | Conjunto de caracteres | Usa UTF-8. Si el emoji está almacenado, usa utf8mb4 para almacenamiento. | forzado |
| | Reglas de clasificación | Usa utf8_general_ci | forzado | |
2. La ley de hierro de la construcción de la mesa
- | Ley de hierro | Nivel | comentario | exégesis | Asegúrate de incluir anotaciones de campo. | forzado |
| | codificar | Usa UTF-8. Si el emoji está almacenado, usa utf8mb4 para almacenamiento. | forzado |
| | si el campo es conceptual | Debe nombrarse con is_xx, y el tipo de dato es unsigned tinyint (1 sí, 0 no), por ejemplo is_deleted(1 eliminar, 0 no eliminado). | forzado | Cualquier campo debe ser sin signo si no es negativo | Nombre de la tabla, nombre del campo | Solo se pueden usar letras minúsculas, guiones bajos o números; Está prohibido comenzar con un subrayado o un número; Solo están prohibidos los números entre dos guiones de fondo; Desactivar las palabras reservadas; El uso de sustantivos plurales está prohibido en los nombres de las tablas. | forzado |
| | La denominación del nombre de la base de datos y del nombre de la tabla | El nombre de la base de datos debe ser consistente con el nombre de la aplicación, y el nombre de la tabla debe estar con Name_Role de negocio de la tabla. | forzado |
| | Denominación de índices | El índice de clave primaria utiliza pk_ nombre de campo; Índice único con uk_ nombre de campo; Los índices normales utilizan nombres de idx_ campo. | forzado | pk_ es la clave primaria; uk_ es una tonalidad única; idx_ es índice | Tipo decimal | El tipo de dato es decimal, y está prohibido el uso de float y double; float y double tienen pérdida de precisión, y si el rango de datos almacenados supera el rango decimal, se recomienda dividir los datos en enteros y decimales y almacenarlos por separado. | forzado |
| | Tipo Varchar | Varchar es una cadena variable larga, no se asigna espacio de almacenamiento de antemano, la longitud no debe superar los 5000 caracteres; si la longitud es mayor a 5000, aplica texto (crea una tabla separada, usa la clave primaria para corresponder, para evitar afectar la eficiencia de indexación de otros campos). | forzado |
| | Debe haber tres campos en el nombre de la tabla | id (el tipo de dato es bigint sin signo, incremento de tabla única, tamaño de paso es 1), gmt_create, gmt_modified (tiempo de creación activa, tiempo de actualización pasiva, tipo de dato es datatime). | forzado |
| | Redundancia de campos | Los campos permiten la redundancia adecuada, pero debe considerarse la consistencia de los datos, y los campos redundantes deben tener 1) modificaciones poco frecuentes; 2) No un campo varchar súper largo, y mucho menos un campo de texto. | Recomendar |
| | Divide la base de datos y las tablas | La partición solo se recomienda cuando el número de filas de una sola tabla supera los 5 millones de filas o la capacidad de una tabla supera los 2 GB. | Recomendar | |
Establecer la longitud adecuada de almacenamiento de caracteres no solo ahorra espacio en tablas de base de datos e índice, sino que, más importante aún, mejora la velocidad de recuperación.
3. Establecer una ley de hierro índice
- | Ley de hierro | Nivel | comentario | Índice único | Los campos con características únicas en el negocio, incluso si son una combinación de campos, deben estar indexados de forma única. Aunque el índice único afecta a la velocidad de inserción, esta pérdida es insignificante, pero mejora significativamente la velocidad de consulta. Además, incluso si la capa de aplicación tiene un control de comprobación muy completo, siempre que no exista un índice único, según la Ley de Murphy, inevitablemente se generarán datos sucios. | forzado |
| | Únete | Más de tres tablas prohíben la unión, campos que requieren unión, y los tipos de datos deben ser consistentes; Cuando se asocian varias tablas a consultas, asegúrate de que los campos asociados tengan un índice. Aunque tengas una doble unión de tablas, presta atención a la indexación de tablas y al rendimiento de SQL. | forzado |
| | Varcharfield | La longitud del índice debe especificarse, y no es necesario indexar todos los campos, solo determinar la longitud del índice según la distinción real del texto. La longitud y distinción del índice son un par de contradicciones; generalmente para los datos de tipo de cadena, los índices con una longitud de 20 tendrán un grado de distinción superior al 90%, que puede determinarse por el grado de distinción de count(distinct left(nombre de columna, longitud del índice))/count(*). | forzado |
| | El desenfoque está prohibido en la búsqueda de páginas | La búsqueda de página prohíbe el desenfoque o el desenfoque completo; si es necesario, por favor accede al motor de búsqueda para solucionarlo. Razón de prohibición: El archivo índice tiene la propiedad de coincidencia de prefijo más a la izquierda del B-Tree, y si no se determina el valor de la izquierda, entonces este índice no puede usarse. | forzado |
| | Ordenar por | Si hay un escenario ordenado por escenario, presta atención al orden del índice. El último campo de orden por forma forma parte del índice combinado y se coloca al final del orden de combinación del índice para evitar file_sort y afectar al rendimiento de las consultas. Ejemplo: ¿dónde a=? ¿y b=? orden por c; El índice debe construirse como a_b_c; Contraejemplo: Si hay una consulta de rango en el índice, entonces no se puede utilizar el orden del índice, como donde a>10 ordena por b; El índice a_b no se puede ordenar. | Recomendar | |
4. Escribir reglas de hierro SQL
- | Ley de hierro | Nivel | comentario | contar(*) | No uses count(nombre de columna) o count(constant) en lugar de count(*), que es la sintaxis para el recuento estándar de filas definido por SQL92, independiente de la base de datos, e independiente de NULL y non-NULL. count(*) cuenta filas con valor NULL, mientras que count(nombre de columna) no cuenta filas con esta columna NULL. | forzado |
| | Conde (col distinto) | Cuenta el número de filas únicas en la columna excepto NULL. Obsé que count(distinct col1, col2), si una de las columnas es toda NULL, entonces devuelve 0 aunque la otra columna tenga un valor diferente. | forzado |
| | Sum(col) | Cuando los valores de una columna son todos NULL, count(col) devuelve 0, pero sum(col) devuelve NULL, por lo que debes estar atento a los problemas de NPE al usar sum(). Los problemas NPE pueden evitarse de las siguientes maneras: seleccionar if(isnull(sum(g)), 0, sum(g)) de la tabla; | forzado |
| | isnull | Usa isnull() para determinar si es un valor NULL. NULL es NULL comparado con cualquier valor. | forzado |
| | Lógica de consulta de paginación | Si el recuento es 0, debe devolverse directamente para evitar ejecutar la siguiente instrucción de paginación. | forzado |
| | Teclas exteriores y cascadas | Está prohibido el uso de claves foráneas y la cascada, y todos los conceptos de clave externa deben resolverse en la capa de aplicación. Motivo: Las claves externas y las cascadas no son adecuadas para clústeres distribuidos de alta concurrencia, las actualizaciones en cascada son fuertes bloqueos, existe el riesgo de tormentas de actualizaciones de bases de datos y las claves foráneas afectan la velocidad de inserción de la base de datos. | forzado |
| | Procedimientos almacenados | Los procedimientos almacenados están prohibidos, y los procedimientos almacenados son difíciles de depurar y escalar, y no son portátiles. | forzado |
| | Corrección de datos | Al corregir datos (especialmente al eliminar o modificar registros), selecciona primero para evitar la eliminación accidental y solo ejecuta la instrucción update después de confirmar que es correcta. | forzado |
| | en | Si no se puede evitar, el número de elementos del conjunto después de dentro debería controlarse dentro de 1000. | Recomendar |
| | Tabla truncada | Está prohibido usar la tabla truncada, que es más rápida que eliminar y consume menos recursos del sistema y del registro, pero truncada es libre de transacciones y no activa disparadores, lo que puede causar accidentes, por lo que no se utilice esta instrucción en el código de desarrollo. | referencia |
|
5. ORM mapea leyes de hierro
| - | Ley de hierro | Nivel | comentario | Consulta de tabla | La lista de campos que están prohibidos de usar * para consultas debe ser clara sobre cuáles campos son necesarios. | forzado |
| | POJO | El atributo booleano de la clase POJO no puede añadirse a is, mientras que el campo de base de datos debe añadirse a is, requiriendo mapeo entre campos y atributos en el resultMap. | forzado |
| | Parámetros de retorno | Está prohibido usar resultClass como parámetro de retorno, incluso si todos los nombres de atributos de clase corresponden uno a campos de base de datos uno por uno, deben definirse; A su vez, cada tabla debe tener un atributo correspondiente. Motivo: Configura la relación de mapeo para acoplar el campo con la clase DO y facilitar el mantenimiento. | forzado |
| | Parámetros de retorno | Está prohibido usar directamente HashMap y HashTable como salida del conjunto de resultados de la consulta. Razón: El tipo de valor del atributo es incontrolable. | forzado |
| | sql.xml Configurar parámetros | sql.xml Utiliza #{}, #param# para los parámetros de configuración, y no uses ${}, ya que ${} es propenso a la inyección SQL. | forzado |
| | queryForList | Está prohibido el uso de queryForList (String statementName, int start, int size) que viene con Mybatis. Razón: Se implementa recuperando todos los registros de la sentencia SQL correspondiente a la sentencia Nombre, y luego usando la subLista para obtener un subconjunto de inicio y tamaño. | forzado |
| | Hora de actualización | Al actualizar un registro de tabla de base de datos, debes actualizar el tiempo de modificación del registro al mismo tiempo. | forzado |
| | Actualizar los registros de tablas de la base de datos | No escribas una interfaz de actualización de datos grande y completa (pasada como una clase POJO). Al ejecutar SQL, no actualice los campos sin cambios debido a la propensión, ineficiencia y almacenamiento en binlogs más alto. | Recomendar |
| | @Transactional | @Transactional No abuses de las transacciones. Las transacciones afectan al QPS de la base de datos. Además, cuando usas transacciones, debes considerar varios aspectos de los esquemas de retroceso, incluyendo el rollback de caché, el rollback de motores de búsqueda, la compensación de mensajes, la corrección estadística, etc. | referencia |
| | Etiquetas SQL dinámicas de Mybatis | < compareValue en isEqual> es una constante comparada con el valor del atributo, normalmente un número, que indica que la sentencia SQL correspondiente se ejecuta cuando es igual; < isNotEmpty> indica que se ejecuta cuando no está vacío ni nulo; < isNotNull> indica que se ejecuta cuando no es nulo. | referencia | |
|