Spesifikasi basis data yang baik membantu mengurangi kompleksitas implementasi perangkat lunak dan mengurangi biaya komunikasi.
1. Hukum besi membangun gudang
- | Hukum besi | Tingkat | Pernyataan | set karakter | Gunakan UTF-8. Jika emoji disimpan, gunakan utf8mb4 untuk penyimpanan. | dipaksa |
| | Aturan penyortiran | Gunakan utf8_general_ci | dipaksa | |
2. Hukum besi konstruksi meja
- | Hukum besi | Tingkat | Pernyataan | Penafsiran | Pastikan untuk memiliki anotasi bidang. | dipaksa |
| | Mengkodekan | Gunakan UTF-8. Jika emoji disimpan, gunakan utf8mb4 untuk penyimpanan. | dipaksa |
| | apakah bidang itu konseptual | Itu harus diberi nama dengan is_xx, dan tipe datanya tidak ditandatangani tinyint(1 ya, 0 tidak), misalnya is_deleted(1 hapus, 0 tidak dihapus). | dipaksa | Bidang apa pun harus tidak ditandatangani jika tidak negatif | Nama tabel, nama bidang | Hanya huruf kecil, garis bawah atau angka yang dapat digunakan; Dilarang memulai dengan garis bawah atau angka; Hanya angka yang dilarang di antara dua garis bawah; Nonaktifkan kata-kata yang dicadangkan; Penggunaan kata benda jamak dilarang dalam nama tabel. | dipaksa |
| | Penamaan nama database dan nama tabel | Nama database harus konsisten dengan nama aplikasi, dan nama tabel harus diberi nama dengan Name_Role Bisnis tabel. | dipaksa |
| | Penamaan indeks | Indeks kunci utama menggunakan nama bidang pk_; Indeks unik dengan nama bidang uk_; Indeks normal menggunakan nama bidang idx_. | dipaksa | pk_ adalah kunci utama; uk_ adalah kunci unik; idx_ adalah indeks | Tipe desimal | Jenis datanya adalah desimal, dan penggunaan float dan double dilarang, float dan double memiliki kerugian presisi, dan jika rentang data yang disimpan melebihi rentang desimal, disarankan untuk membagi data menjadi bilangan bulat dan desimal dan menyimpannya secara terpisah. | dipaksa |
| | Jenis Varchar | Varchar adalah string panjang variabel, tidak ada ruang penyimpanan yang dialokasikan terlebih dahulu, panjangnya tidak boleh melebihi 5000 karakter, jika panjangnya lebih besar dari 5000, terapkan teks (buat tabel terpisah, gunakan kunci utama untuk berkorespondensi, untuk menghindari mempengaruhi efisiensi pengindeksan bidang lain). | dipaksa |
| | Harus ada tiga bidang dalam nama tabel | id (tipe data tidak ditandatangani bigint, peningkatan tabel tunggal, ukuran langkah adalah 1), gmt_create, gmt_modified (waktu pembuatan aktif, waktu pembaruan pasif, tipe data adalah tanggalwaktu). | dipaksa |
| | Redundansi bidang | Bidang memungkinkan redundansi yang sesuai, tetapi konsistensi data harus dipertimbangkan, dan bidang redundan harus memiliki 1) modifikasi yang jarang; 2) Bukan bidang super panjang varchar, apalagi bidang teks. | Merekomendasikan |
| | Bagi database dan tabel | Partisi direkomendasikan hanya jika jumlah baris dalam satu tabel melebihi 5 juta baris atau kapasitas satu tabel melebihi 2 GB. | Merekomendasikan | |
Mengatur panjang penyimpanan karakter yang sesuai tidak hanya menghemat ruang tabel database dan penyimpanan indeks, tetapi yang lebih penting, meningkatkan kecepatan pengambilan.
3. Tetapkan hukum besi indeks
- | Hukum besi | Tingkat | Pernyataan | Indeks unik | Bidang dengan karakteristik unik dalam bisnis, meskipun merupakan kombinasi bidang, harus diindeks secara unik. Meskipun indeks unik memengaruhi kecepatan penyisipan, kerugian ini dapat diabaikan, tetapi secara signifikan meningkatkan kecepatan kueri. Selain itu, meskipun lapisan aplikasi memiliki kontrol cek yang sangat lengkap, selama tidak ada indeks unik, menurut Hukum Murphy, data kotor pasti akan dihasilkan. | dipaksa |
| | bergabung | Lebih dari tiga tabel melarang penggabungan, bidang yang memerlukan penggabungan, dan jenis data harus konsisten; Saat beberapa tabel dikaitkan dengan kueri, pastikan bidang terkait harus memiliki indeks. Bahkan jika Anda memiliki penggabungan tabel ganda, perhatikan pengindeksan tabel, kinerja SQL. | dipaksa |
| | Varcharfield | Panjang indeks harus ditentukan, dan tidak perlu mengindeks semua bidang, cukup tentukan panjang indeks sesuai dengan perbedaan teks yang sebenarnya. Panjang dan perbedaan indeks adalah sepasang kontradiksi, umumnya untuk data jenis string, indeks dengan panjang 20 akan memiliki tingkat perbedaan lebih dari 90%, yang dapat ditentukan oleh tingkat perbedaan count (berbeda kiri (nama kolom, panjang indeks))/count (*). | dipaksa |
| | Blurring dilarang dalam penelusuran halaman | Pencarian halaman melarang keburaman atau keburaman penuh, jika perlu, silakan buka mesin pencari untuk mengatasinya. Alasan Larangan: File indeks memiliki properti pencocokan awalan paling kiri dari B-Tree, dan jika nilai di sebelah kiri tidak ditentukan, maka indeks ini tidak dapat digunakan. | dipaksa |
| | Pesan oleh | Jika ada urutan berdasarkan skenario, perhatikan keteraturan indeks. Bidang urutan terakhir oleh adalah bagian dari indeks gabungan dan ditempatkan di akhir urutan kombinasi indeks untuk menghindari file_sort dan memengaruhi performa kueri. Contoh: di mana a=? dan b=? perintah oleh c; Indeks harus dibangun sebagai a_b_c; Contoh tandingan: Jika ada pencarian rentang dalam indeks, maka keterurutan indeks tidak dapat digunakan, seperti di mana a>10 mengurutkan dengan b; a_b indeks tidak dapat diurutkan. | Merekomendasikan | |
4. Tulis aturan besi SQL
- | Hukum besi | Tingkat | Pernyataan | hitungan(*) | Jangan gunakan count(column name) atau count(constant) alih-alih count(*), yang merupakan sintaks untuk jumlah standar baris yang ditentukan oleh SQL92, independen dari database, dan independen dari NULL dan non-NULL. count(*) menghitung baris dengan nilai NULL, sedangkan count(nama kolom) tidak menghitung baris dengan kolom ini NULL. | dipaksa |
| | hitung (kol yang berbeda) | Menghitung jumlah baris unik dalam kolom kecuali NULL. Perhatikan bahwa count(distinct col1, col2), jika salah satu kolom semuanya NULL, maka itu mengembalikan 0 bahkan jika kolom lain memiliki nilai yang berbeda. | dipaksa |
| | jumlah(kol) | Ketika nilai kolom semuanya NULL, count(col) mengembalikan 0, tetapi sum(col) mengembalikan NULL, jadi Anda perlu mengetahui masalah NPE saat menggunakan sum(). Masalah NPE dapat dihindari dengan cara berikut: pilih if(isnull(sum(g)), 0, sum(g)) dari tabel; | dipaksa |
| | isnull | Gunakan isnull() untuk menentukan apakah itu adalah nilai NULL. NULL adalah NULL dibandingkan dengan nilai apa pun. | dipaksa |
| | Logika kueri penomoran halaman | Jika hitungannya adalah 0, itu harus dikembalikan secara langsung untuk menghindari eksekusi pernyataan penomoran halaman berikutnya. | dipaksa |
| | Kunci dan kaskade luar | Penggunaan kunci asing dan cascading dilarang, dan semua konsep kunci asing harus diselesaikan di lapisan aplikasi. Alasan: Kunci dan kaskade asing tidak cocok untuk kluster konkurensi tinggi yang terdistribusi, pembaruan berjenjang adalah pemblokiran yang kuat, ada risiko badai pembaruan database, dan kunci asing memengaruhi kecepatan penyisipan database. | dipaksa |
| | Prosedur tersimpan | Prosedur tersimpan dilarang, dan prosedur tersimpan sulit untuk di-debug dan diskalakan, dan tidak portabel. | dipaksa |
| | Koreksi data | Saat mengoreksi data (terutama menghapus atau memodifikasi rekaman), pilih terlebih dahulu untuk menghindari penghapusan yang tidak disengaja, dan hanya jalankan pernyataan pembaruan setelah mengonfirmasi bahwa itu benar. | dipaksa |
| | dalam | Jika tidak dapat dihindari, jumlah elemen set setelahnya harus dikontrol dalam 1000. | Merekomendasikan |
| | Meja potong | Dilarang menggunakan memotong tabel, yang lebih cepat daripada menghapus dan menggunakan lebih sedikit sumber daya sistem dan log, tetapi memotong bebas transaksi dan tidak memicu pemicu, yang dapat menyebabkan kecelakaan, jadi jangan gunakan pernyataan ini dalam kode pengembangan. | referensi |
|
5. ORM memetakan hukum besi
| - | Hukum besi | Tingkat | Pernyataan | kueri tabel | Daftar bidang yang dilarang menggunakan * untuk kueri harus jelas bidang mana yang diperlukan. | dipaksa |
| | POJO | Atribut Boolean dari kelas POJO tidak dapat ditambahkan ke is, sedangkan bidang database harus ditambahkan ke is, memerlukan pemetaan antara bidang dan atribut di resultMap. | dipaksa |
| | Parameter pengembalian | Dilarang menggunakan resultClass sebagai parameter pengembalian, bahkan jika semua nama atribut kelas sesuai dengan bidang database satu per satu, mereka perlu ditentukan; Pada gilirannya, setiap tabel harus memiliki atribut yang sesuai dengannya. Alasan: Konfigurasikan hubungan pemetaan untuk memasangkan bidang dengan kelas DO untuk perawatan yang mudah. | dipaksa |
| | Parameter pengembalian | Dilarang secara langsung menggunakan HashMap dan HashTable sebagai output dari kumpulan hasil kueri. Alasan: Jenis nilai atribut tidak dapat dikendalikan. | dipaksa |
| | sql.xml Mengonfigurasi parameter | sql.xml Gunakan #{}, #param# untuk parameter konfigurasi, dan jangan gunakan ${}, karena ${} rentan terhadap injeksi SQL. | dipaksa |
| | queryForList | Penggunaan queryForList(String statementName, int start, int size) yang disertakan dengan Mybatis dilarang. Alasan: Ini diimplementasikan dengan mengambil semua rekaman pernyataan SQL yang sesuai dengan statementName dalam database, lalu menggunakan subList untuk mendapatkan subset start, size. | dipaksa |
| | Waktu pembaruan | Saat memperbarui rekaman tabel database, Anda harus memperbarui waktu modifikasi rekaman secara bersamaan. | dipaksa |
| | Perbarui rekaman tabel database | Jangan menulis antarmuka pembaruan data yang besar dan lengkap (diteruskan sebagai kelas POJO). Saat menjalankan SQL, jangan perbarui bidang yang tidak berubah karena penyimpanan binlog yang rawan kesalahan, tidak efisien, dan meningkat. | Merekomendasikan |
| | @Transactional | @Transactional Jangan menyalahgunakan transaksi. Transaksi memengaruhi QPS database. Selain itu, di mana Anda menggunakan transaksi, Anda perlu mempertimbangkan berbagai aspek skema pengembalian, termasuk pengembalian cache, pengembalian mesin pencari, kompensasi pesan, koreksi statistik, dll. | referensi |
| | Tag sql dinamis Mybatis | < compareValue di isEqual> adalah konstanta dibandingkan dengan nilai atribut, biasanya angka, yang menunjukkan bahwa pernyataan SQL yang sesuai dijalankan jika sama; < isNotEmpty> menunjukkan bahwa itu dieksekusi ketika tidak kosong dan tidak null; < isNotNull> menunjukkan bahwa itu dieksekusi ketika bukan null. | referensi | |
|