Добрата спецификация на базата данни помага за намаляване на сложността на софтуерната имплементация и намаляване на комуникационните разходи.
1. Железният закон за изграждането на склад
- | Железен закон | Ниво | Забележка | Набор от символи | Използвай UTF-8. Ако емоджито се съхранява, използвайте utf8mb4 за съхранение. | принудително |
| | Правила за сортиране | Използвайте utf8_general_ci | принудително | |
2. Желязният закон при изграждането на таблици
- | Железен закон | Ниво | Забележка | Обяснение | Не забравяйте да имате полеви анотации. | принудително |
| | кодирам | Използвай UTF-8. Ако емоджито се съхранява, използвайте utf8mb4 за съхранение. | принудително |
| | дали областта е концептуална | Той трябва да бъде именуван с is_xx, а типът данни е unsigned tinyint(1 да, 0 не), напр. is_deleted(1 delete, 0 not deleted). | принудително | Всяко поле трябва да е без знак, ако не е отрицателно | Име на таблицата, име на полето | Могат да се използват само малки букви, подчертаване или цифри; Забранено е да се започва с подчертаване или число; Забранени са само числа между две долни линии; Деактивирайте резервираните думи; Използването на множествено число съществителни е забранено в имената на таблиците. | принудително |
| | Именуване на името на базата данни и името на таблицата | Името на базата данни трябва да е съвместимо с името на приложението, а името на таблицата да е с бизнес 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 GB. | препоръчвам | |
Задаването на подходящата дължина на паметта за символи не само спестява място в таблицата на базата данни и индексното съхранение, но още по-важно – подобрява скоростта на извличане.
3. Установяване на индекс на железен закон
- | Железен закон | Ниво | Забележка | Уникален индекс | Полета с уникални характеристики в бизнеса, дори и да са комбинация от полета, трябва да бъдат уникално индексирани. Въпреки че уникалният индекс влияе на скоростта на вмъкване, тази загуба е незначителна, но значително подобрява скоростта на заявки. Освен това, дори ако приложният слой има много пълен контрол върху проверката, докато няма уникален индекс, според закона на Мърфи, непоколебите данни неизбежно ще бъдат генерирани. | принудително |
| | Присъедини се | Повече от три таблици забраняват присъединяването, полета, които изискват join, и типовете данни трябва да са последователни; Когато няколко таблици са свързани с заявки, уверете се, че свързаните полета трябва да имат индекс. Дори и да имате двойно свързване на таблици, обърнете внимание на индексирането на таблиците и производителността на SQL. | принудително |
| | Варчарфийлд | Дължината на индекса трябва да бъде зададена и няма нужда да се индексират всички полета, просто се определя дължината на индекса според действителното разграничение на текста. Дължината на индекса и разграничението са двойка противоречия, обикновено за данни от тип низ, индексите с дължина 20 имат степен на разграничение над 90%, която може да се определи от степента на разграничение на броя (distinct left(име на колона, дължина на индекса))/count(*). | принудително |
| | Размазването е забранено при търсене на страници | Търсенето на страници забранява размазването или пълното замъгляване, ако е необходимо, моля, отидете в търсачката, за да го решите. Причина за забрана: Индексният файл има свойството за съвпадение на най-левия префикс на B-дървото, и ако стойността вляво не е определена, този индекс не може да се използва. | принудително |
| | Поръчка от | Ако има ред по сценарий, обърнете внимание на подредбата на индекса. Последното поле на реда по е част от комбинирания индекс и се поставя в края на реда на комбинацията на индекси, за да се избегне file_sort и да се повлияе на производителността на заявката. Пример: където a=? и b=? ред по c; Индексът трябва да се изгражда по a_b_c; Контрапример: Ако има търсене на диапазон в индекса, тогава индексната подредба не може да се използва, например когато a>10 е наредена по b; Индексът a_b не може да бъде сортиран. | препоръчвам | |
4. Пишете SQL железни правила
- | Железен закон | Ниво | Забележка | count(*) | Не използвайте 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 в базата данни, и след това използване на подсписъка за получаване на подмножество от начални и размерни данни. | принудително |
| | Време за актуализация | При актуализиране на запис в таблицата на базата данни трябва едновременно да актуализирате времето за промяна на записа. | принудително |
| | Актуализиране на записите с таблици в базата данни | Не пишете голям и пълен интерфейс за обновяване на данни (предаден като POJO клас). При изпълнение на SQL не обновявайте непроменените полета поради склонност към грешки, неефективност и увеличено съхранение в бинлог. | препоръчвам |
| | @Transactional | @Transactional Не злоупотребявайте с транзакции. Транзакциите влияят на QPS на базата данни. Освен това, когато използвате транзакции, трябва да вземете предвид различни аспекти на схемите за връщане, включително връщане на кеша, връщане на търсачки, компенсация на съобщения, статистическа корекция и др. | препратка |
| | Mybatis динамични SQL тагове | < compareValue в isEqual> е константа спрямо стойността на атрибута, обикновено число, което показва, че съответният SQL оператор се изпълнява, когато е равно; < isNotEmpty> означава, че се изпълнява, когато не е празно и не е null; < isNotNull> означава, че се изпълнява, когато не е нулево. | препратка | |
|