Naming Convention va Schema Design best practices
Loyihaga yangi dasturchi qo'shildi. U jadvalni ochdi:
SELECT * FROM Usr;
-- ustunlar: usrNm, usrEml, crDt, isActv, usrTyp
Nima ekanligini tushunishga vaqt ketadi. Yaxshi nomlash konvensiyasi — kod o'zini tushuntiradi.
Jadval nomlari
✅ kichik harf, ko'plik, snake_case
foydalanuvchilar
buyurtmalar
mahsulot_kategoriyalari
❌ qochish kerak
Foydalanuvchi — bosh harf (PostgreSQL kichik harfga o'tkazadi)
user — SQL kalit so'z
tbl_users — prefiks shart emas
userData — camelCase (PostgreSQL da muammo)
Ustun nomlari
✅ kichik harf, snake_case, aniq
id
ism
email_manzil
yaratilgan_vaqt
faol_mi
❌ qochish kerak
nm — qisqartma, tushunarsiz
date — SQL kalit so'z
isActive — camelCase
user_id_fk — _fk suffiksi shart emas
Primary Key va Foreign Key
-- Primary Key — doim "id"
CREATE TABLE foydalanuvchilar (
id SERIAL PRIMARY KEY
);
-- Foreign Key — jadval_nomi_id
CREATE TABLE buyurtmalar (
id SERIAL PRIMARY KEY,
foydalanuvchi_id INT REFERENCES foydalanuvchilar(id),
manzil_id INT REFERENCES manzillar(id)
);
Index nomlari
-- idx_jadval_ustun
CREATE INDEX idx_foydalanuvchilar_email ON foydalanuvchilar (email);
CREATE INDEX idx_buyurtmalar_holat_sana ON buyurtmalar (holat, sana);
-- uq_ — unique index
CREATE UNIQUE INDEX uq_foydalanuvchilar_email ON foydalanuvchilar (email);
-- fk_ — foreign key constraint
ALTER TABLE buyurtmalar
ADD CONSTRAINT fk_buyurtmalar_foydalanuvchi
FOREIGN KEY (foydalanuvchi_id) REFERENCES foydalanuvchilar(id);
Standart ustunlar — har jadvaldа
CREATE TABLE mahsulotlar (
id BIGSERIAL PRIMARY KEY,
-- ... biznes maydonlari ...
yaratilgan TIMESTAMPTZ NOT NULL DEFAULT NOW(),
yangilangan TIMESTAMPTZ NOT NULL DEFAULT NOW(),
o_chirilgan TIMESTAMPTZ -- soft delete uchun
);
TIMESTAMPTZ — timezone bilan, TIMESTAMP emas. Server timezone o'zgarganda muammo bo'lmaydi.
Soft Delete
Ma'lumotni o'chirmaslik — o'chirilgan vaqtini belgilash:
-- O'chirish
UPDATE mahsulotlar SET o'chirilgan = NOW() WHERE id = 1;
-- Faqat faollarni ko'rish
SELECT * FROM mahsulotlar WHERE o'chirilgan IS NULL;
-- Yoki VIEW bilan
CREATE VIEW faol_mahsulotlar AS
SELECT * FROM mahsulotlar WHERE o'chirilgan IS NULL;
Tez-tez uchraydigan xatolar
VARCHAR uzunligini o'ylamasdan belgilash:
-- ❌ — ism uchun 10 ta belgi kam bo'lishi mumkin
ism VARCHAR(10)
-- ✅ — TEXT cheksiz, kerak bo'lsa CHECK bilan cheklash
ism TEXT NOT NULL CHECK (length(ism) <= 100)
NULL va NOT NULL aralashib ketishi:
-- Har maydon NOT NULL yoki NULL bo'lishi ongli qaror bo'lsin
email TEXT NOT NULL, -- har doim bo'lishi kerak
telefon TEXT, -- bo'lmasligi mumkin — NULL
bio TEXT DEFAULT '' -- ❌ — NULL o'rniga bo'sh matn, farq yo'qoladi
Xulosa
Jadval → ko'plik, kichik harf, snake_case (foydalanuvchilar)
Ustun → kichik harf, snake_case (yaratilgan_vaqt)
PK → id (BIGSERIAL yoki UUID)
FK → jadval_id (foydalanuvchi_id)
Index → idx_jadval_ustun
Constraint→ fk_, uq_, chk_ prefikslari
Standart ustunlar: id, yaratilgan, yangilangan, (o'chirilgan)
Vaqt: TIMESTAMPTZ — har doim timezone bilan
Keyingi dars
52-dars: User, Role, GRANT, REVOKE — huquqlarni boshqarish