অধ্যায় ১০.১ — স্কিমা পরিচিতি
১. উদ্দেশ্য
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:Ncore_roles: ভূমিকাcore_permissions: অনুমতিcore_role_permissions: M:Ncore_user_roles: M:Ncore_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 codeDATETIME(6)মাইক্রোসেকেন্ড precisionVARCHARUTF-8mb4 (emoji + Bangla support)JSONsemi-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