এই ভলিউমে · ভলিউম 10
ডেটাবেস
স্কিমা পরিচিতি ER ডায়াগ্রাম

অধ্যায় ১০.১ — স্কিমা পরিচিতি

১. উদ্দেশ্য

travoBooks-এর ডেটাবেস স্কিমার উচ্চ-স্তরের সংগঠন।

২. স্কিমা গ্রুপ (Prefix)

গ্রুপ প্রিফিক্স বিষয়বস্তু
Core core_ partner, user, role, permission, branch
Operations ops_ booking, ticket, segment, passenger, supplier_record
Financial fin_ journal_entry, account, period, recon
Integration integ_ supplier_credentials, supplier_request_log, webhook_*
BSP bsp_ bsp_files, bsp_lines, memos (ADM/ACM)
Notification notif_ templates, outbox, in_app_inbox
Audit audit_ audit_logs, change_history

৩. সর্বজনীন কলাম

প্রতিটি ব্যবসা-অর্থবোধক টেবিলে:

partner_id      BIGINT NOT NULL,
created_at      DATETIME(6) NOT NULL,
created_by      BIGINT NOT NULL,
updated_at      DATETIME(6),
updated_by      BIGINT,
version         INT NOT NULL DEFAULT 1

version optimistic locking-এর জন্য।

৪. মূল টেবিল গ্রুপিং

Core

  • core_partners: পার্টনার আইডেন্টিটি, কনফিগ
  • core_users: ব্যবহারকারী
  • core_user_partner: ব্যবহারকারী ↔ পার্টনার M:N
  • core_roles: ভূমিকা
  • core_permissions: অনুমতি
  • core_role_permissions: M:N
  • core_user_roles: M:N
  • core_branches: শাখা/অফিস

Operations

  • ops_bookings: প্রাথমিক বুকিং
  • ops_booking_segments: ফ্লাইট/স্টে সেগমেন্ট
  • ops_booking_passengers: যাত্রী
  • ops_booking_tickets: টিকেট
  • ops_supplier_records: PNR/order রেফারেন্স

Financial

  • fin_chart_of_accounts: CoA (অ্যাকাউন্ট তালিকা)
  • fin_journal_entries: JE হেডার
  • fin_journal_entry_lines: JE লাইন
  • fin_periods: পিরিয়ড স্টেট
  • fin_period_snapshots: closed period স্ন্যাপশট

৫. ফরেন কী Convention

(partner_id, *_id) যৌথভাবে FK:

FOREIGN KEY (partner_id, customer_id) 
  REFERENCES core_customers (partner_id, customer_id)

এটি multi-tenancy enforce করে — ক্রস-পার্টনার রেফারেন্স ব্লক।

৬. ইনডেক্সিং স্ট্র্যাটেজি

  • (partner_id, primary_key) প্রতিটি টেবিলে
  • foreign keys-এ
  • search-heavy columns (e.g., booking.supplier_record_locator)
  • (partner_id, status, created_at DESC) যেখানে status-filter সাধারণ

৭. পার্টিশনিং

বড় টেবিল journal_entry_lines, audit_logs: - HASH partitioning by partner_id - বা RANGE by created_at (monthly)

৮. ডেটা টাইপ

  • DECIMAL(20, 4) আর্থিক পরিমাণ
  • CHAR(3) ISO currency code
  • DATETIME(6) মাইক্রোসেকেন্ড precision
  • VARCHAR UTF-8mb4 (emoji + Bangla support)
  • JSON semi-structured (event payloads, settings)

৯. View

পার্টনার-স্কোপড vieş (RLS-এর মতো):

CREATE VIEW partners.bookings AS
SELECT * FROM ops_bookings 
WHERE partner_id = @current_partner_id;

অ্যাপ্লিকেশন views ক্যোয়েরি করে, সরাসরি টেবিল নয়।

১০. মাইগ্রেশন

  • Schema changes: db/migrations/{timestamp}_{description}.sql
  • Reversible (UP + DOWN)
  • Forward-compatible — পুরাতন কোড নতুন schema-তে কাজ করবে
  • প্রোডাকশনে: maintenance window-এ apply

১১. সাধারণ ফাঁদ

  • ⚠️ partner_id ছাড়া FK — RLS ভঙ্গ হতে পারে
  • ⚠️ version ছাড়া concurrent update — last-write-wins, lost updates
  • ⚠️ JSON-এ critical query field — index করা যায় না কার্যকরভাবে
  • ⚠️ DATETIME timezone-aware না — confusion in multi-region