Naming Convention va Schema Design best practices

~15 daq · MySQL · Ma'lumotlar Bazasini Loyihalash

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 key
  • created_at, updated_at — "bu qachon o'zgardi?" savoli har doim chiqadi
  • utf8mb4 — har doim

Turlar

  • Pul — DECIMAL(12,2) yoki tiyinda BIGINT, hech qachon FLOAT (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 KEY bilan (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, telefon3 ustunlar
  • ❌ Parolni ochiq yoki md5 bilan (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 key
  • is_, 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