首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

車票管理系統:車次座位數據批量生成設計方案

     編輯:程式設計疑難解答

業務場景

開發車票管理系統,包含「車次表」與「車票表」。車次表中可設定座位總數(如 20 個),需自動在車票表生成對應數量的車票記錄,每張票僅「票號」與「座位號」不同,其餘字段(車次、發車時間、票價等)相同。

設計思路

方案一:存儲過程/觸發器自動化(推薦)

在車次表插入或更新座位數時,由資料庫層面自動批量生成車票記錄,避免應用層循環寫入的性能開銷。

-- MySQL 示例
CREATE TRIGGER after_train_insert
AFTER INSERT ON train_schedule
FOR EACH ROW
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i <= NEW.seat_count DO
        INSERT INTO tickets (train_id, seat_no, ticket_no, status)
        VALUES (NEW.id, i, CONCAT(NEW.train_code, LPAD(i,3,'0')), 'available');
        SET i = i + 1;
    END WHILE;
END;

方案二:應用層批量插入

若業務邏輯較複雜(如需分配座位類型、價格梯度),在 Service 層組裝 List<Ticket> 後使用 batchInsert(MyBatis `` / JPA `saveAll` / ADO.NET `SqlBulkCopy`)單次提交,減少網絡往返。

方案三:視圖/虛擬表按需計算

若車票數據量極大且查詢頻繁,可不物理存儲每張票,改用「車次+座位號」組合鍵動態計算,通過視圖暴露給上層。但需注意:訂單、鎖座等寫操作仍需實體表支持並發控制。

關鍵設計要點

  • 唯一性約束:`(train_id, seat_no)` 聯合唯一索引,防止重複生成。
  • 狀態機:`available → locked → sold / released`,配合樂觀鎖(version 字段)解決高併發搶票。
  • 分表策略:按日期/車次分片,避免單表過大。

總結

核心原則是「數據庫層面自動化生成基礎數據,應用層專注業務流程控制」。優先採用觸發器或存儲過程實現座位數到車票的映射,配合批量操作與並發控制,可顯著降低開發複雜度並提升系統吞吐量。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved