Naming Convention va Schema Design best practices

~15 daq · PostgreSQL · Ma'lumotlar Bazasini Loyihalash

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