Якісна специфікація бази даних допомагає знизити складність реалізації програмного забезпечення та знизити витрати на комунікацію.
1. Залізний закон будівництва складу
- | Закон заліза | Рівень | Зауваження | Набір символів | Використовуйте UTF-8. Якщо емодзі зберігається, використовуйте utf8mb4 для зберігання. | примусовий |
| | Правила сортування | Використовуйте utf8_general_ci | примусовий | |
2. Залізний закон побудови таблиць
- | Закон заліза | Рівень | Зауваження | Екзегеза | Обов'язково додайте польові анотації. | примусовий |
| | кодувати | Використовуйте UTF-8. Якщо емодзі зберігається, використовуйте utf8mb4 для зберігання. | примусовий |
| | чи є ця галузь концептуальною | Він має бути названий is_xx, а тип даних — unsigned tinyint(1 yes, 0 no), наприклад is_deleted(1 видалення, 0 не видалено). | примусовий | Будь-яке поле має бути беззнаковим, якщо воно не є від'ємним | Назва таблиці, ім'я поля | Можна використовувати лише малі літери, підкреслення або цифри; Заборонено починати з підкреслення або числа; Між двома підкресленнями заборонені лише числа; Вимкніть зарезервовані слова; Використання множини іменників заборонено в назвах таблиць. | примусовий |
| | Назви бази даних та назви таблиці | Ім'я бази даних має відповідати іменню додатку, а ім'я таблиці — з бізнес-Name_Role таблиці. | примусовий |
| | Іменування індексу | Індекс первинного ключа використовує pk_ назву поля; Унікальний індекс із uk_ назвою поля; Звичайні індекси використовують idx_ назви полів. | примусовий | pk_ є первинним ключем; uk_ унікальний ключ; idx_ — індекс | Десятковий тип | Тип даних десятковий, і використання float і double заборонено, float і double мають втрату точності, а якщо збережений діапазон даних перевищує десятковий, рекомендується розділити дані на цілі та десяткові та зберігати їх окремо. | примусовий |
| | Тип варчар | varchar — це змінний довгий рядок, наперед не виділяється місце для зберігання, довжина не повинна перевищувати 5000 символів, якщо довжина перевищує 5000, застосовуйте текст (створіть окрему таблицю, використовуйте первинний ключ для відповідності, щоб не впливати на ефективність індексації інших полів). | примусовий |
| | У назві таблиці має бути три поля | ID (тип даних — незнаковий bigint, збільшення однієї таблиці, розмір кроку — 1), gmt_create, gmt_modified (час активного створення, пасивне оновлення, тип даних — datetime). | примусовий |
| | Надлишковість поля | Поля забезпечують відповідну резервність, але потрібно враховувати узгодженість даних, і надлишкові поля повинні мати 1) рідкісні зміни; 2) Не дуже довге поле варчара, не кажучи вже про текстове поле. | Рекомендую |
| | Розділіть базу даних і таблиці | Розбивання рекомендується лише тоді, коли кількість рядків в одній таблиці перевищує 5 мільйонів рядків або ємність однієї таблиці перевищує 2 ГБ. | Рекомендую | |
Встановлення відповідної довжини сховища символів не лише економить місце в таблиці бази даних і індекс, а ще важливіше — покращує швидкість пошуку.
3. Встановити індексний закон заліза
- | Закон заліза | Рівень | Зауваження | Унікальний індекс | Галузі з унікальними характеристиками в бізнесі, навіть якщо вони є комбінацією полів, мають бути унікально індексовані. Хоча унікальний індекс впливає на швидкість вставки, ця втрата незначна, але суттєво підвищує швидкість запиту. Крім того, навіть якщо рівень застосування має дуже повний контроль перевірки, доки немає унікального індексу згідно із законом Мерфі, неминуче будуть генеруватися брудні дані. | примусовий |
| | Приєднуйся | Більше трьох таблиць забороняють приєднання, поля, що потребують об'єднання, а типи даних мають бути узгодженими; Коли з запитами пов'язано кілька таблиць, переконайтеся, що відповідні поля мають мати індекс. Навіть якщо у вас є подвійне об'єднання таблиць, звертайте увагу на індексацію таблиць і продуктивність SQL. | примусовий |
| | Варчарфілд | Довжину індексу потрібно вказати, і немає потреби індексувати всі поля, достатньо визначати довжину індексу відповідно до фактичного розрізнення тексту. Довжина індексу та відмінність — це пара суперечностей, зазвичай для даних типу рядків індекси довжиною 20 мають ступінь розрізнення понад 90%, який можна визначити ступенем розрізнення count(distinct left(назва колонки, довжина індексу))/count(*). | примусовий |
| | Розмиття заборонено під час пошуку на сторінці | Пошук по сторінці забороняє розмиття або повне розмиття, якщо потрібно, будь ласка, зверніться до пошукової системи, щоб це вирішити. Причина заборони: індексний файл має найлівішу префіксну властивість відповідності дерева B, і якщо значення зліва не визначено, то цей індекс не можна використовувати. | примусовий |
| | Порядок | Якщо є порядок за сценарієм, звертайте увагу на впорядкованість індексу. Останнє поле порядку за є частиною комбінованого індексу і розміщується в кінці порядку комбінації індексу, щоб уникнути file_sort і вплинути на продуктивність запиту. Приклад: де a=? а b=? порядок за c; Індекс слід будувати за a_b_c; Контрприклад: якщо в індексі є пошук за діапазоном, то індексна впорядкованість не може бути використана, наприклад, коли a>10 впорядковано за b; Індекс a_b не можна відсортувати. | Рекомендую | |
4. Пишіть залізні правила SQL
- | Закон заліза | Рівень | Зауваження | count(*) | Не використовуйте кількість (назва стовпця) або count(константа) замість count(*), що є синтаксисом стандартної кількості рядків, визначених SQL92, незалежно від бази даних і незалежна від NULL та не-NULL. count(*) рахує рядки з NULL-значенням, тоді як count(назва стовпця) не рахує рядки з цим стовпцем NULL. | примусовий |
| | граф (окремий перехід) | Рахує кількість унікальних рядків у стовпці, крім NULL. Зверніть увагу, що при count(distinct col1, col2), якщо один із стовпців має всі NULL, то він повертає 0, навіть якщо інший стовпець має інше значення. | примусовий |
| | sum(col) | Коли всі значення стовпця дорівнюють NULL, count(col) повертає 0, а sum(col) — NULL, тому потрібно враховувати проблеми з NPE при використанні sum(). Задачі NPE можна уникнути наступними способами: вибрати if(isnull(sum(g)), 0, sum(g)) з таблиці; | примусовий |
| | isnull | Використовуйте isnull(), щоб визначити, чи є це NULL-значенням. NULL — це NULL порівняно з будь-яким значенням. | примусовий |
| | Логіка запиту до пагінації | Якщо рахунок дорівнює 0, його слід повернути безпосередньо, щоб уникнути виконання наступного оператора пагінації. | примусовий |
| | Зовнішні ключі та каскади | Використання зовнішніх ключів і каскадування заборонено, і всі концепції зовнішніх ключів мають розв'язуватися на рівні застосування. Причина: зовнішні ключі та каскади не підходять для розподілених кластерів з високим рівнем конкурентності, каскадні оновлення є сильним блокуванням, існує ризик бурних оновлень бази даних, а зовнішні ключі впливають на швидкість вставки бази даних. | примусовий |
| | Збережені процедури | Збережені процедури заборонені, а збережені процедури важко налагодити та масштабувати, і вони не портативні. | примусовий |
| | Корекція даних | При виправленні даних (особливо при видаленні або зміні записів) спочатку оберіть, щоб уникнути випадкового видалення, і виконуйте оператор оновлення лише після підтвердження правильності. | примусовий |
| | у | Якщо цього не вдається уникнути, кількість елементів набору після входу слід контролювати в межах 1000. | Рекомендую |
| | Таблиця усячень | Заборонено використовувати таблицю урізання, яка швидша за видалення і використовує менше системних і логових ресурсів, але утрачка не має транзакцій і не запускає тригерів, які можуть спричинити аварії, тому не використовуйте цю заяву в коді розробки. | Посилання |
|
5. ORM картографує залізні закони
| - | Закон заліза | Рівень | Зауваження | Запит до таблиці | Список полів, які заборонено використовувати * для запитів, має бути чітким, які саме поля є обов'язковими. | примусовий |
| | POJO | Булевий атрибут класу POJO не можна додати до is, тоді як поле бази даних потрібно додати до is, що вимагає відображення між полями та атрибутами в resultMap. | примусовий |
| | Параметри повернення | Заборонено використовувати resultClass як параметр повернення, навіть якщо всі імена атрибутів класів відповідають полям бази даних по одному, їх потрібно визначити; У свою чергу, кожна таблиця повинна мати відповідний атрибут. Причина: Налаштуйте відношення відтворення так, щоб поєднати поле з класом DO для зручного обслуговування. | примусовий |
| | Параметри повернення | Заборонено безпосередньо використовувати HashMap і HashTable як вихід набору результатів запиту. Причина: Тип значення атрибута неконтрольований. | примусовий |
| | sql.xml Налаштування параметрів | sql.xml Використовуйте #{}, #param# для параметрів конфігурації і не використовуйте ${}, оскільки ${} схильний до SQL-ін'єкції. | примусовий |
| | queryForList | Використання queryForList (String statementName, int start, int size), що йде в Mybatis, заборонено. Причина: Це реалізується шляхом отримання всіх записів SQL-оператора, що відповідає оператору statementName у базі даних, а потім використання підсписку для отримання підмножини start, size. | примусовий |
| | Час оновлення | Під час оновлення запису таблиці даних потрібно одночасно оновити час зміни запису. | примусовий |
| | Оновлення записів таблиці бази даних | Не пишіть великий і повний інтерфейс для оновлення даних (який був у класі POJO). Під час виконання SQL не оновлюйте незмінені поля через схильність до помилок, неефективність і збільшення обсягу зберігання бінлогу. | Рекомендую |
| | @Transactional | @Transactional Не зловживайте транзакціями. Транзакції впливають на QPS бази даних. Крім того, коли ви використовуєте транзакції, потрібно враховувати різні аспекти схем відкату, включно з відкатом кешу, відкатом пошукових систем, компенсацією повідомлень, статистичною корекцією тощо. | Посилання |
| | Динамічні SQL-теги Mybatis | < compareValue у isEqual> є константою порівняно з атрибутним значенням, зазвичай числом, що вказує на виконання відповідного SQL-оператора при рівні умов; < isNotEmpty> означає, що він виконується, коли він не є порожнім і не нуль; < isNotNull> означає, що він виконується, коли він не є нульовим. | Посилання | |
|