İyi bir veritabanı spesifikasyonu, yazılım uygulamasının karmaşıklığını azaltmaya ve iletişim maliyetlerini azaltmaya yardımcı olur.
1. Depo inşa etmenin demir yasası
- | Demir yasa | Seviye | Açıklama | Karakter seti | UTF-8 kullanın. Emoji saklanıyorsa, depolama için utf8mb4 kullanın. | zorla |
| | Sıralama kuralları | Kullanın utf8_general_ci | zorla | |
2. Masa yapımının demir yasası
- | Demir yasa | Seviye | Açıklama | tefsir | Saha açıklamaları olduğundan emin olun. | zorla |
| | kodlamak | UTF-8 kullanın. Emoji saklanıyorsa, depolama için utf8mb4 kullanın. | zorla |
| | alanın kavramsal olup olmadığı | Adı is_xx ile olmalı ve veri tipi işaretsiz tinyint (1 evet, 0 noy), örneğin is_deleted(1 sil, 0 silinmedi). | zorla | Herhangi bir alan negatif değilse işaretsiz olmalıdır | Tablo adı, alan adı | Sadece küçük harfler, alt çizgiler veya rakamlar kullanılabilir; Altı çizgi veya sayı ile başlamak yasaktır; İki alt çizgi arasında sadece sayılar yasaktır; Ayrılmış kelimeleri devre dışı bırak; Tablo isimlerinde çoğul isimlerin kullanımı yasaktır. | zorla |
| | Veritabanı adı ve tablo adının adlandırılması | Veritabanı adı, uygulama adıyla tutarlı olmalı ve tablo adı tablonun İş Name_Role ile adlandırılmalıdır. | zorla |
| | Indeks isimlendirmesi | Birincil anahtar indeksi pk_ alan adını kullanır; Alan adı uk_ benzersiz indeks; Normal indeksler idx_ alan adları kullanır. | zorla | pk_ birincil anahtardır; uk_ benzersiz bir anahtardır; idx_ indeksdir | Ondalık tip | Veri türü ondalıktır ve float ile double kullanımı yasaktır, float ve double hassasiyet kaybı yapar ve eğer depolanan veri aralığı ondalık aralığını aşarsa, verilerin tam sayılar ve ondalık sayılara bölünüp ayrı ayrı saklanması önerilir. | zorla |
| | varchar tipi | Varchar, değişken uzun bir dizidir, önceden depolama alanı ayrılmaz, uzunluk 5000 karakteri geçmemelidir, eğer uzunluk 5000'den fazlaysa metin uygulanabilir (ayrı bir tablo oluşturun, birincil anahtarı kullanarak karşılık verin, böylece diğer alanların indeksleme verimliliğini etkilememek için). | zorla |
| | Tablo adında üç alan olmalı | id (veri tipi imzasız bigint, tek tablo artışı, adım boyutu 1), gmt_create, gmt_modified (aktif oluşturma zamanı, pasif güncelleme zamanı, veri tipi datetime). | zorla |
| | Alan yedekliği | Alanlar uygun yedekliliğe izin verir, ancak veri tutarlılığı dikkate alınmalıdır ve yedek alanlar 1) nadiren değiştirilmelidir; 2) Varchar süper uzun alan değil, metin alanı ise hiç yok. | Öner |
| | Veritabanı ve tabloları böl | Bölümlendirme yalnızca tek bir tablodaki satır sayısı 5 milyon satırı aştığında veya tek bir tablonun kapasitesi 2 GB'ı geçtiğinde önerilir. | Öner | |
Uygun karakter depolama süresinin ayarlanması sadece veritabanı tablosu ve indeks depolamasını tasarruf etmekle kalmaz, daha da önemlisi alma hızını artırır.
3. Bir indeks demir yasası oluşturun
- | Demir yasa | Seviye | Açıklama | Benzersiz indeks | İşte benzersiz özelliklere sahip alanlar, alanlar kombinasyonu bile olsalar bile, benzersiz şekilde indekslenmelidir. Benzersiz indeks ekleme hızını etkilese de, bu kayıp önemsizdir, ancak sorgu hızını önemli ölçüde artırır. Ayrıca, uygulama katmanı çok kapsamlı kontrol kontrolüne sahip olsa bile, Murphy Yasası'na göre benzersiz bir indeks olmadığı sürece, kirli veriler kaçınılmaz olarak üretilecektir. | zorla |
| | Join | Üçten fazla tablo birleştirmeyi engeller, katılım gerektiren alanlar ve veri türlerinin tutarlı olması gerekir; Birden fazla tablo sorgularla ilişkilendirildiğinde, ilgili alanların bir indeks olması gerektiğinden emin olun. Çift tablo birleştirmeniz olsa bile, tablo indekslemesine ve SQL performansına dikkat edin. | zorla |
| | Varcharfield | Indeks uzunluğu belirtilmeli ve tüm alanları indekslemeye gerek yoktur, sadece indeks uzunluğunu gerçek metin ayrımına göre belirler. Indeks uzunluğu ve ayrım, genellikle dizi tipi veriler için çelişkiler çiftidir; 20 uzunluğuna sahip indekslerin ayırt derecesi %90'dan fazladır; bu da sayı(farklı sol(sütun adı, indeks uzunluğu))/sayı(*) ayrım derecesine göre belirlenebilir. | zorla |
| | Sayfa aramasında bulanıklaştırma yasaktır | Sayfa araması bulanıklaşmayı veya tamamen bulanıklığı engeller, gerekirse lütfen çözmek için arama motoruna gidin. Yasaklama Nedeni: Indeks dosyası, B-Ağacı'nın en soldaki önek eşleştirme özelliğine sahiptir ve eğer soldaki değer belirlenmezse, bu indeks kullanılamaz. | zorla |
| | Sipariş | Senaryoya göre bir düzen varsa, indeksin düzenliliğine dikkat edin. Siparişin son alanı birleşik indeksin bir parçasıdır ve file_sort önlemek ve sorgu performansını etkilemek için indeks kombinasyon sırasının sonunda yerleştirilir. Örnek: burada a=? ve b=? C ile sıra; Indeks a_b_c şeklinde oluşturulmalıdır; Karşı örnek: Indekste bir aralık araması varsa, indeks sırası kullanılamaz, örneğin a>10 b'ye göre sıralanır; Index a_b sıralanamaz. | Öner | |
4. SQL demir kuralları yaz
- | Demir yasa | Seviye | Açıklama | count(*) | count(column name) veya count(constant) yerine count(sabit) kullanmayın; count(*), SQL92 tarafından tanımlanan standart satır sayısı için soru sözdizimi, veritabanından bağımsız ve NULL ile non-NULL'dan bağımsızdır. count(*) NULL değerli satırları sakarken, count(column name) bu sütunlu NULL satırları saymaz. | zorla |
| | Count(belirgin col) | NULL hariç sütundaki benzersiz satır sayısını sayar. Count(farklı col1, col2), sütunlardan biri NULL ise, diğer sütunun değeri farklı olsa bile 0 döner. | zorla |
| | sum(col) | Bir sütunun tüm değerleri NULL olduğunda, count(col) 0 döner, ancak sum(col) NULL döner, bu yüzden sum() kullanırken NPE sorunlarının farkında olmanız gerekir. NPE problemleri şu şekilde önlenebilir: tablodan if(isnull(sum(g)), 0, sum(g)) seçin; | zorla |
| | isnull | ISNULL() kullanarak bunun NULL bir değer olup olmadığını belirleyin. NULL, herhangi bir değere kıyasla NULL'dur. | zorla |
| | Sayfalama sorgulama mantığı | Sayı 0 ise, sonraki sayfa ifadesinin yürütülmemesi için doğrudan geri gönderilmelidir. | zorla |
| | Dış anahtarlar ve kaskadlar | Yabancı anahtarların kullanımı ve zincirleme yasaktır ve tüm yabancı anahtar kavramları uygulama katmanında çözülmelidir. Sebep: Yabancı anahtarlar ve kaskadlar dağıtık, yüksek eşdeğerli kümeler için uygun değildir, zincirleme güncellemeler güçlü engeller, veritabanı güncelleme fırtınaları riski vardır ve yabancı anahtarlar veritabanının ekleme hızını etkiler. | zorla |
| | Depolanmış prosedürler | Saklanan prosedürler yasaktır, saklanan prosedürler hata ayıklamak ve ölçeklendirmek zordur ve taşınabilir değildir. | zorla |
| | Veri düzeltmesi | Veri düzeltirken (özellikle kayıtları silerken veya değiştirirken), yanlışlıkla silinmesini önlemek için önce seçin ve güncelleme ifadesini ancak doğru olduğundan emin olduktan sonra çalıştırın. | zorla |
| | içinde | Eğer önlenemezse, sonraki set eleman sayısı 1000 içinde kontrol edilmeli. | Öner |
| | Kısmal tablo | Silmekten daha hızlı olan ve daha az sistem ile log kaynağı kullanan truncate table kullanmak yasaktır, ancak truncate işlem içermez ve tetikleyicileri tetiklemez, bu da kazalara yol açabilir, bu yüzden bu ifadeyi geliştirme kodunda kullanmayın. | referans |
|
5. ORM, demir yasaları haritalıyor
| - | Demir yasa | Seviye | Açıklama | Tablo sorgusu | Sorgular için * kullanması yasak olan alanların listesi, hangi alanların gerekli olduğu net olmalıdır. | zorla |
| | POJO | POJO sınıfının Boolean özniteliği is'ye eklenemezken, veritabanı alanı is'e eklenmelidir; bu nedenle resultMap'teki alanlar ile öznitelikler arasında eşleme gereklidir. | zorla |
| | Dönüş parametreleri | resultClass'ı dönüş parametresi olarak kullanmak yasaktır, tüm sınıf öznitelik adları veritabanı alanlarına teker teker karşılık gelse bile, tanımlanmalıdır; Her tablonun da ona karşılık gelen bir özniteliğe sahip olması gerekir. Sebep: Eşleme ilişkisini alanı DO sınıfıyla eşleştirecek şekilde yapılandırmak, böylece bakım kolay olsun. | zorla |
| | Dönüş parametreleri | Sorgu sonuç kümesinin çıktısı olarak doğrudan HashMap ve HashTable kullanılması yasaktır. Sebep: Özellik değerinin türü kontrol edilemezdir. | zorla |
| | sql.xml Parametreleri yapılandırma | sql.xml Yapılandırma parametreleri için #{}, #param# kullanın ve ${} kullanmayın, çünkü ${} SQL enjeksiyonuna açıktır. | zorla |
| | queryForList | Mybatis ile gelen queryForList (String statementName, int start, int size) kullanımı yasaktır. Sebep: Veritabanındaki statementName ile ilgili SQL ifadesinin tüm kayıtlarını alınarak ve ardından subList kullanılarak start, boyut alt kümesi elde edilmesiyle uygulanır. | zorla |
| | Güncelleme zamanı | Bir veritabanı tablosu kaydını güncellerken, kaydın değişiklik süresini aynı anda güncellemeniz gerekir. | zorla |
| | Veritabanı tablosu kayıtlarını güncelle | Büyük ve tam bir veri güncelleme arayüzü yazmayın (POJO sınıfı olarak geçilmiş). SQL çalıştırılırken, hata yapmaya meyilli, verimsiz ve artan binlog depolama nedeniyle değişmemiş alanları güncellemeyin. | Öner |
| | @Transactional | @Transactional İşlemleri kötüye kullanma. İşlemler, veritabanının QPS'sini etkiler. Ayrıca, işlemler kullandığınızda, önbellek geri alması, arama motoru geri alması, mesaj tazminatı, istatistiksel düzeltme gibi geri alma şemalarının çeşitli yönlerini göz önünde bulundurmanız gerekir. | referans |
| | Mybatis dinamik sql etiketleri | < compareValue, isEqual> özellik değerine kıyasla bir sabittir, genellikle bir sayıdır ve karşılık gelen SQL ilanının eşit olduğunda yürütüldüğünü gösterir; < isNotEmpty> boş ve null olmadığında yürütüldüğünü gösterir; < isNotNull> null olmadığında yürütüldüğünü gösterir. | referans | |
|