Relationships ও Normalization

লেসন ১৯ / ৩৯

Database Relationship

১. One-to-One (1:1)

-- User + UserProfile
CREATE TABLE user_profiles (
    user_id INT PRIMARY KEY,
    bio TEXT,
    avatar VARCHAR(255),
    FOREIGN KEY (user_id) REFERENCES users(id)
);

২. One-to-Many (1:N) ⭐ সবচেয়ে সাধারণ

-- একজন user → অনেক post
CREATE TABLE posts (
    id INT PRIMARY KEY,
    user_id INT NOT NULL,
    title VARCHAR(200),
    FOREIGN KEY (user_id) REFERENCES users(id)
);

৩. Many-to-Many (N:M)

Junction/pivot table দরকার।

CREATE TABLE enrollments (
    student_id INT,
    course_id INT,
    enrolled_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    grade VARCHAR(2),
    PRIMARY KEY (student_id, course_id),
    FOREIGN KEY (student_id) REFERENCES students(id),
    FOREIGN KEY (course_id) REFERENCES courses(id)
);

ERD (Entity Relationship Diagram)

users                    posts
┌────────┐              ┌────────┐
│ id PK  │──────1:N─────│user_id │
│ name   │              │ title  │
└────────┘              └────────┘

Normalization

Data redundancy ও anomaly কমানোর প্রক্রিয়া। Table-কে ছোট অংশে ভাঙা হয়।

Un-normalized (ভুল)

orders
┌────┬─────────┬──────────┬───────────┐
│ id │user_name│user_email│ products  │
├────┼─────────┼──────────┼───────────┤
│ 1  │ করিম    │ k@...    │বই,কলম,খাতা│
└────┴─────────┴──────────┴───────────┘
❌ user info পুনরাবৃত্তি
❌ products atomic নয়

1NF — প্রতিটি cell atomic

orders                 order_items
(order_id)             (order_id, product_id)

2NF — প্রতিটি non-key পুরো PK-এর উপর নির্ভর

-- ❌ order_items (order_id, product_id, product_name, price)
-- product_name শুধু product_id-এর উপর

-- ✅
order_items (order_id, product_id, quantity)
products (id, name, price)

3NF — transitive dependency নেই

-- ❌ employees (id, name, dept_id, dept_name)
-- dept_name → dept_id এর উপর নির্ভর

-- ✅
employees (id, name, dept_id)
departments (id, name)

Normalization কেন?

  • Data redundancy কমায়
  • Update anomaly এড়ায়
  • Insert/Delete anomaly সমাধান