Naming Convention va Schema Design best practices
Muammodan boshlaylik
Uch yildan beri ishlab turgan loyihaning bazasi:
Users, tbl_orders, product, OrderItems, customer_addr, cat
user.UserID, tbl_orders.user_id, OrderItems.orderId, product.CategoryID
order.Date, order.date_created, order.createdAt
Har bir dasturchi o'z uslubida yozgan. Endi har bir so'rovda: "jadval nomi katta harf bilan edimi? user_id mi yoki UserID mi? created_at mi yoki date_created mi?" Linux serverga ko'chirilganda esa Users va users turli jadval bo'lib qoldi va yarim so'rovlar buzildi.
Nomlash qoidalari — kichik narsa. Lekin ular kundalik ishning har bir daqiqasiga ta'sir qiladi.
Asosiy qoidalar
1. Kichik harf va snake_case
✅ buyurtma_qatorlari, mijoz_id, yaratilgan
❌ BuyurtmaQatorlari, MijozID, Yaratilgan, buyurtmaQatorlari
Sababi: Linux da MySQL jadval nomlari harfga sezgir (ular fayl nomi), Windows va macOS da esa — yo'q. Windows da ishlab, Linux serverga ko'chirganda Users ≠ users. Faqat kichik harf — muammo umuman yo'q.
2. Faqat lotin harflari, raqamlar va _
❌ mijoz ismi, mijoz-ismi, o'lcham, мижозлар
✅ mijoz_ismi, olcham
Bo'sh joy, tire, apostrof va kirill — har safar teskari tirnoq (`) talab qiladi va ORM larda muammo chiqaradi. O'zbekcha o', g' — apostrofsiz: olcham, ogirlik.
3. SQL kalit so'zlaridan qoching
❌ order, group, user, key, index, status, date, desc, rank
SELECT * FROM order; -- ERROR 1064
SELECT * FROM `order`; -- ishlaydi, lekin har doim teskari tirnoq
Ko'plik shakli ko'pincha yechim: orders, groups, users — kalit so'z emas.
4. Bitta til
Yo hammasi inglizcha, yo hammasi o'zbekcha. Aralashma emas:
❌ mijozlar.created_at, orders.mijoz_id, products.narx
Bu kursda o'rganish uchun o'zbekcha ishlatildi. Haqiqiy loyihalarda ko'pincha inglizcha tanlanadi — freymvorklar (Laravel created_at, updated_at), ORM lar va xalqaro jamoalar uchun. Muhimi — izchillik.
Jadval nomlari
| Qoida | ✅ | ❌ |
|---|---|---|
| Ko'plikda | mijozlar, orders |
mijoz, order |
| Prefikssiz | orders |
tbl_orders, t_orders |
| Qisqartmasiz | kategoriyalar |
cat, ctg |
| Oraliq jadval — ikki nom | mahsulot_teglar, role_user |
mt, links |
Ko'plik yoki birlik — bahsli mavzu. Ikkala uslub ham keng tarqalgan; Laravel va Rails — ko'plik. Asosiysi — bitta loyihada bitta uslub.
Ustun nomlari
Primary key — id
✅ mijozlar.id
❌ mijozlar.mijoz_id, mijozlar.MijozID, mijozlar.ID
Foreign key — birlik_id
✅ buyurtmalar.mijoz_id, mahsulotlar.toifa_id
❌ buyurtmalar.mijoz, buyurtmalar.client, buyurtmalar.m_id
Ustun nomi qaysi jadvalga ishora qilishini aytadi. Bir jadvalga ikki xil ishora bo'lsa — rolni qo'shing:
xabarlar.yuboruvchi_id → foydalanuvchilar.id
xabarlar.qabul_qiluvchi_id → foydalanuvchilar.id
Mantiqiy (bool) ustunlar — savol shaklida
✅ is_active, is_deleted, has_discount, faolmi, tolanganmi
❌ active, status, flag, deleted
WHERE is_active = 1 — o'z-o'zidan tushunarli. WHERE status = 1 — "1" nima degani?
Sana va vaqt — izchil qo'shimcha
✅ created_at, updated_at, deleted_at, paid_at, birth_date
❌ created, date, time, CreatedDate, dt
_at — DATETIME/TIMESTAMP (aniq lahza), _date — DATE (kun). Laravel aynan shunday.
Birliklar — nomda
✅ narx_som, ogirlik_gr, davomiylik_sek, hajm_mb
❌ narx, ogirlik, davomiylik
Ayniqsa bir nechta valyuta yoki birlik bo'lishi mumkin bo'lsa.
Indeks va cheklov nomlari
Xato xabarida nima buzilganini darhol tushunish uchun:
| Tur | Format | Misol |
|---|---|---|
| Indeks | idx_jadval_ustunlar |
idx_buyurtmalar_mijoz_holat |
| Unique | uq_jadval_ustun |
uq_mijozlar_email |
| Foreign key | fk_bola_ota |
fk_buyurtmalar_mijozlar |
| Check | chk_jadval_qoida |
chk_mahsulotlar_narx_musbat |
ERROR 3819: Check constraint 'chk_mahsulotlar_narx_musbat' is violated.
Nomsiz bo'lsa — mahsulotlar_chk_1 — qaysi qoida ekanini qidirish kerak.
Sxema loyihalash bo'yicha amaliy qoidalar
Har bir jadvalda
CREATE TABLE har_qanday_jadval (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-- ... ma'lumot ustunlari ...
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NULL ON UPDATE CURRENT_TIMESTAMP
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;
id— sun'iy, ma'nosiz primary keycreated_at,updated_at— "bu qachon o'zgardi?" savoli har doim chiqadiutf8mb4— har doim
Turlar
- Pul —
DECIMAL(12,2)yoki tiyindaBIGINT, hech qachonFLOAT(4-dars) - Telefon, pasport, indeks —
VARCHAR, son emas VARCHAR(255)ni o'ylamasdan qo'ymang —ism VARCHAR(100),iso_kod CHAR(2)NOT NULL— standart;NULL— faqat "noma'lum bo'lishi mumkin" bo'lganda
Ma'lumot yaxlitligi — bazada
- Barcha munosabatlar —
FOREIGN KEYbilan (7-dars) - Noyob qiymatlar —
UNIQUE - Oddiy qoidalar —
CHECK - Ilovadagi tekshiruv — foydalanuvchi uchun; bazadagi — ma'lumot uchun
Holatlar
ENUM('yangi', 'tolangan', ...) — kichik, kam o'zgaradigan ro'yxat
holat_id → holatlar(id) — tez-tez o'zgaradigan yoki ko'p atributli
Hech qachon
- ❌ Ro'yxatni vergul bilan bitta ustunda (
teglar = 'php,mysql,js') - ❌
telefon1,telefon2,telefon3ustunlar - ❌ Parolni ochiq yoki
md5bilan (PHP kursi, 38-dars) - ❌ Bir xil ma'lumotni sababsiz ikki joyda (47-dars)
- ❌ Ishlab chiqish va production uchun bir xil baza
Izohlar
CREATE TABLE buyurtmalar (
holat ENUM(...) NOT NULL COMMENT 'yolda — kuryer olgan, yetkazildi — mijoz qabul qilgan',
...
) COMMENT = 'Mijoz buyurtmalari. Bekor qilinganlar o''chirilmaydi.';
Izohlar SHOW CREATE TABLE da va GUI vositalarda ko'rinadi — yangi dasturchi uchun eng yaqin hujjat.
Mavjud loyihada
Eski bazada boshqa uslub bo'lsa — mavjud uslubga moslashing. Yarim jadval UserID, yarmi user_id bo'lgan baza — har biri izchil bo'lgan bazadan yomonroq. Nomlarni o'zgartirish — faqat rejali migratsiya bilan, barcha kodni bir vaqtda yangilab.
Nima uchun shunday?
Nima uchun nomlash qoidalariga bunchalik e'tibor berish kerak — bular shunchaki nomlar-ku?
Chunki baza sxemasi — eng uzoq yashaydigan kod. Ilova freymvorki 5 yilda almashadi, frontend — 2 yilda. Jadval nomlari esa 15 yil yashaydi va yuzlab so'rovlarda, hisobotlarda, integratsiyalarda tarqalib ketadi. Yomon nomni keyin o'zgartirish — butun tizim bo'ylab qidirish va qayta yozish. Bir marta to'g'ri nomlash — 15 yillik qulaylik.
Xulosa
Eslab qoling:
- Kichik harf,
snake_case, faqat lotin, raqam va_ - SQL kalit so'zlaridan qoching:
order,user,group - Bitta til, bitta uslub — izchillik eng muhim
- Jadvallar — ko'plikda, prefikssiz; oraliq jadval — ikki nomdan
id— primary key;birlik_id— foreign keyis_,has_— bool;_at— vaqt lahzasi; birliklar nomda- Indeks va cheklovlarga nom:
idx_,uq_,fk_,chk_ - Har jadvalda:
id,created_at,updated_at,utf8mb4 - Mavjud loyihada — mavjud uslubga moslashing
Keyingi dars
50-dars: User yaratish, GRANT, REVOKE — huquqlarni boshqarish