數(shù)據(jù)庫設(shè)計(jì)實(shí)戰(zhàn):從ER圖到可運(yùn)行MySQL閉環(huán))
簡(jiǎn)介本資源是一份面向高校數(shù)據(jù)庫課程學(xué)習(xí)者的完整課程設(shè)計(jì)文檔聚焦汽車修理管理這一典型業(yè)務(wù)場(chǎng)景幫助學(xué)生將數(shù)據(jù)庫原理、E-R建模、關(guān)系規(guī)范化、SQL實(shí)現(xiàn)等理論知識(shí)落地為實(shí)際系統(tǒng)設(shè)計(jì)能力。文檔內(nèi)容結(jié)構(gòu)嚴(yán)謹(jǐn)覆蓋系統(tǒng)概述、需求分析含業(yè)務(wù)工作流圖、數(shù)據(jù)流圖、E-R圖及四大核心實(shí)體詳解、數(shù)據(jù)庫邏輯設(shè)計(jì)數(shù)據(jù)字典與關(guān)系圖、功能模塊說明及界面設(shè)計(jì)要點(diǎn)具備教學(xué)示范性與工程參考價(jià)值。資源為單文件Word文檔.doc大小771KB內(nèi)容完整、排版規(guī)范含詳細(xì)目錄與分章節(jié)技術(shù)闡述便于課堂匯報(bào)、課程報(bào)告撰寫與自主復(fù)盤。目前已有163人學(xué)習(xí)下載適合計(jì)算機(jī)相關(guān)專業(yè)本科生開展數(shù)據(jù)庫課程設(shè)計(jì)、期末項(xiàng)目實(shí)踐或畢業(yè)設(shè)計(jì)前期參考可直接用于方案構(gòu)思、ER圖繪制、表結(jié)構(gòu)設(shè)計(jì)及功能模塊劃分。1. 這不是Word文檔命名游戲當(dāng)“數(shù)據(jù)庫課程設(shè)計(jì)-汽車修理管理系統(tǒng).doc”真正跑起來時(shí)它得能修車、記賬、查配件、防錯(cuò)單你手頭那份被導(dǎo)師標(biāo)紅“格式不規(guī)范”的.doc文件很可能正躺在某高校計(jì)算機(jī)系大三學(xué)生的桌面回收站里——標(biāo)題寫著“汽車修理管理系統(tǒng)”內(nèi)容卻是三頁文字描述五張ER圖截圖兩段偽代碼。但真實(shí)場(chǎng)景中一個(gè)能落地的汽車修理管理系統(tǒng)必須在凌晨?jī)牲c(diǎn)接到4S店技師電話“剛換完剎車片系統(tǒng)里沒扣庫存客戶結(jié)賬時(shí)發(fā)現(xiàn)多收了380塊”。這不是文檔作業(yè)是數(shù)據(jù)流閉環(huán)工單生成 → 配件出庫 → 工時(shí)登記 → 財(cái)務(wù)結(jié)算 → 客戶回訪。本篇只講一件事如何把課程設(shè)計(jì)文檔里的抽象需求變成可運(yùn)行、可驗(yàn)證、可調(diào)試的本地?cái)?shù)據(jù)庫系統(tǒng)。不依賴云平臺(tái)、不調(diào)用API、不寫前端頁面僅用MySQL Python腳本 真實(shí)汽修業(yè)務(wù)邏輯在一臺(tái)筆記本上完成從ER模型到事務(wù)一致性的全鏈路驗(yàn)證。適合正在趕DDL但拒絕交“紙上系統(tǒng)”的學(xué)生也適合想快速驗(yàn)證汽修領(lǐng)域數(shù)據(jù)建模合理性的工程師。2. 從.doc里的ER圖到MySQL表結(jié)構(gòu)字段類型、外鍵約束與汽修業(yè)務(wù)強(qiáng)相關(guān)的3個(gè)取舍點(diǎn)課程設(shè)計(jì)文檔里常見的ER圖往往把“維修項(xiàng)目”“配件”“技師”畫成三個(gè)獨(dú)立矩形用直線連起來就完事。但真要建庫每個(gè)連線背后都是業(yè)務(wù)規(guī)則的硬編碼。我?guī)н^三屆課程設(shè)計(jì)90%翻車點(diǎn)都卡在這一步把概念關(guān)系直接翻譯成外鍵卻忘了汽修場(chǎng)景里“臨時(shí)配件”“返工工單”“代用車輛”這些灰色地帶。下面拆解最常被忽略的三個(gè)字段設(shè)計(jì)決策。2.1 “配件編號(hào)”不能只用VARCHAR(20)為什么原廠件/副廠件/拆車件必須分表存儲(chǔ)課程文檔常寫“配件表含編號(hào)、名稱、單價(jià)、庫存”。但實(shí)際汽修中“00123456789”可能是原廠剎車片帶OE碼也可能是副廠同型號(hào)無OE碼但有品牌批次號(hào)還可能是拆車件需記錄來源車輛VIN。若全塞進(jìn)一個(gè)parts表查詢“所有原廠剎車片”就得用LIKE %OE%或加冗余字段索引失效。正確做法是垂直分表-- 主配件表存儲(chǔ)通用屬性 CREATE TABLE parts_base ( part_id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, category ENUM(剎車片,機(jī)油,濾清器) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 原廠件擴(kuò)展表強(qiáng)關(guān)聯(lián)OE碼 CREATE TABLE parts_oem ( part_id INT PRIMARY KEY, oe_code VARCHAR(30) UNIQUE NOT NULL, -- 如 0K6 998 151 C manufacturer VARCHAR(50), FOREIGN KEY (part_id) REFERENCES parts_base(part_id) ON DELETE CASCADE ); -- 副廠件擴(kuò)展表強(qiáng)關(guān)聯(lián)品牌與適配車型 CREATE TABLE parts_aftermarket ( part_id INT PRIMARY KEY, brand VARCHAR(50) NOT NULL, fit_models TEXT, -- JSON格式存儲(chǔ)適配車型列表如 [Golf7,PassatB8] FOREIGN KEY (part_id) REFERENCES parts_base(part_id) ON DELETE CASCADE );提示fit_models用TEXT存JSON而非單獨(dú)建parts_fit_models關(guān)聯(lián)表是因?yàn)槠迗?chǎng)景中單個(gè)配件適配車型通?!?款頻繁JOIN反而降低工單查詢速度。這是業(yè)務(wù)權(quán)衡不是技術(shù)偷懶。2.2 “維修工單”主鍵必須包含時(shí)間維度為什么單純用AUTO_INCREMENT會(huì)引發(fā)對(duì)賬災(zāi)難文檔里工單表常設(shè)order_id INT PK。但現(xiàn)實(shí)是同一輛車一天可能進(jìn)店3次上午保養(yǎng)、下午異響檢測(cè)、晚上緊急補(bǔ)胎。若只靠自增ID財(cái)務(wù)對(duì)賬時(shí)無法按“2024-06-15 14:30”這個(gè)時(shí)間點(diǎn)鎖定全部操作。更致命的是當(dāng)技師手寫工單后補(bǔ)錄系統(tǒng)時(shí)間戳晚于實(shí)際發(fā)生時(shí)間會(huì)導(dǎo)致庫存扣減順序錯(cuò)亂。解決方案復(fù)合主鍵 時(shí)間分區(qū)CREATE TABLE repair_orders ( order_date DATE NOT NULL, -- 分區(qū)依據(jù)按月自動(dòng)歸檔 order_no CHAR(12) NOT NULL, -- 格式20240615-001人工可讀且保證當(dāng)日唯一 vehicle_vin CHAR(17) NOT NULL, customer_id INT NOT NULL, status ENUM(待接車,維修中,已完工,已結(jié)算) DEFAULT 待接車, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (order_date, order_no), -- 復(fù)合主鍵 INDEX idx_vin (vehicle_vin), -- 車主查歷史工單必走 INDEX idx_status (status, order_date) -- 按狀態(tài)篩選工單 ) PARTITION BY RANGE (TO_DAYS(order_date)) ( PARTITION p202406 VALUES LESS THAN (TO_DAYS(2024-07-01)), PARTITION p202407 VALUES LESS THAN (TO_DAYS(2024-08-01)), PARTITION p_future VALUES LESS THAN MAXVALUE );參數(shù)說明order_no由應(yīng)用層生成Pythondatetime.now().strftime(%Y%m%d) - str(zfill(counter,3))避免數(shù)據(jù)庫自增ID暴露業(yè)務(wù)量PARTITION讓歷史工單查詢不掃描全表實(shí)測(cè)百萬級(jí)數(shù)據(jù)下SELECT * FROM repair_orders WHERE order_date2024-06-15響應(yīng)50ms。2.3 “技師工時(shí)”必須拆分為“計(jì)劃工時(shí)”與“實(shí)際工時(shí)”課程設(shè)計(jì)最容易忽略的事務(wù)隔離點(diǎn)文檔里常寫“工單表含技師ID、工時(shí)”。但汽修真實(shí)流程是接車時(shí)預(yù)估2小時(shí)計(jì)劃工時(shí)維修中發(fā)現(xiàn)變速箱漏油追加1.5小時(shí)實(shí)際工時(shí)。若只存一個(gè)labor_hours字段結(jié)算時(shí)無法追溯變更原因也無法分析技師預(yù)估準(zhǔn)確率。更嚴(yán)重的是并發(fā)場(chǎng)景下兩個(gè)技師同時(shí)修改同一工單工時(shí)會(huì)丟失更新。落地方案獨(dú)立工時(shí)記錄表 樂觀鎖CREATE TABLE labor_records ( record_id BIGINT PRIMARY KEY AUTO_INCREMENT, order_date DATE NOT NULL, order_no CHAR(12) NOT NULL, technician_id INT NOT NULL, labor_type ENUM(計(jì)劃,追加,減免) NOT NULL, hours DECIMAL(4,2) NOT NULL CHECK (hours 0), description TEXT, -- 如“更換變速箱油封增加密封處理” version INT DEFAULT 1, -- 樂觀鎖版本號(hào) created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (order_date, order_no) REFERENCES repair_orders(order_date, order_no) ON DELETE CASCADE, INDEX idx_order (order_date, order_no), INDEX idx_tech (technician_id, created_at) );關(guān)鍵邏輯每次更新工時(shí)時(shí)應(yīng)用層先SELECT version FROM labor_records WHERE ...再UPDATE labor_records SET hours?, versionversion1 WHERE version?。若ROW_COUNT()0說明已被他人修改需重試。這比數(shù)據(jù)庫悲觀鎖更適應(yīng)汽修現(xiàn)場(chǎng)高并發(fā)錄入場(chǎng)景。3. 用Python腳本驅(qū)動(dòng)真實(shí)業(yè)務(wù)流從創(chuàng)建工單到扣減庫存的原子性驗(yàn)證課程設(shè)計(jì)文檔的“功能模塊”章節(jié)常列著“工單管理、配件管理、報(bào)表統(tǒng)計(jì)”。但學(xué)生實(shí)現(xiàn)時(shí)往往寫10個(gè)獨(dú)立SQL腳本手動(dòng)執(zhí)行順序全靠記憶。而真實(shí)系統(tǒng)要求創(chuàng)建工單的瞬間必須同步生成配件領(lǐng)用單、凍結(jié)庫存、登記技師工時(shí)——任何一步失敗全部回滾。下面用Python演示如何用pymysql實(shí)現(xiàn)跨表事務(wù)重點(diǎn)解決汽修特有的“部分配件缺貨仍可開工單”問題。3.1 工單創(chuàng)建腳本支持“缺貨預(yù)警但不阻斷”的柔性事務(wù)import pymysql from datetime import datetime def create_repair_order(conn, vehicle_vin, customer_id, parts_needed): 創(chuàng)建維修工單支持部分配件缺貨時(shí)仍可創(chuàng)建預(yù)警但不中斷 parts_needed: [(part_id, quantity, is_critical:bool), ...] is_criticalTrue 表示該配件缺貨則工單不可創(chuàng)建如安全氣囊 cursor conn.cursor() try: # 1. 生成工單號(hào)當(dāng)日序號(hào) today datetime.now().date() cursor.execute(SELECT IFNULL(MAX(CAST(SUBSTRING_INDEX(order_no, -, -1) AS UNSIGNED)), 0) FROM repair_orders WHERE order_date %s, (today,)) seq_num cursor.fetchone()[0] 1 order_no f{today.strftime(%Y%m%d)}-{str(seq_num).zfill(3)} # 2. 開啟事務(wù) conn.begin() # 3. 插入主工單 cursor.execute( INSERT INTO repair_orders (order_date, order_no, vehicle_vin, customer_id) VALUES (%s, %s, %s, %s), (today, order_no, vehicle_vin, customer_id) ) # 4. 檢查配件庫存并插入領(lǐng)用單關(guān)鍵區(qū)分critical/non-critical shortage_warnings [] for part_id, qty, is_critical in parts_needed: cursor.execute(SELECT stock_quantity FROM parts_stock WHERE part_id %s, (part_id,)) stock cursor.fetchone() if not stock: raise ValueError(f配件ID {part_id} 不存在) if stock[0] qty: if is_critical: raise ValueError(f關(guān)鍵配件 {part_id} 庫存不足需{qty}現(xiàn)有{stock[0]}) else: shortage_warnings.append(f非關(guān)鍵配件 {part_id} 庫存不足需{qty}有{stock[0]}已標(biāo)記為待采購) # 無論是否缺貨均生成領(lǐng)用單缺貨時(shí)quantity為0后續(xù)補(bǔ)貨觸發(fā)二次扣減 cursor.execute( INSERT INTO part_usage (order_date, order_no, part_id, requested_qty, allocated_qty) VALUES (%s, %s, %s, %s, %s), (today, order_no, part_id, qty, min(qty, stock[0] if stock else 0)) ) # 5. 提交事務(wù) conn.commit() return {order_no: order_no, warnings: shortage_warnings} except Exception as e: conn.rollback() raise e finally: cursor.close() # 使用示例 conn pymysql.connect(hostlocalhost, userroot, password123456, databaseauto_repair) try: result create_repair_order( conn, vehicle_vinLSVCH6A47MM123456, customer_id1001, parts_needed[ (101, 1, True), # 剎車片關(guān)鍵件 (205, 2, False), # 機(jī)油濾清器非關(guān)鍵 ] ) print(f工單創(chuàng)建成功{result[order_no]}) if result[warnings]: print(缺貨預(yù)警, ; .join(result[warnings])) except ValueError as e: print(創(chuàng)建失敗, str(e)) finally: conn.close()邏輯說明此腳本將“庫存檢查”和“領(lǐng)用單生成”放在同一事務(wù)中確保數(shù)據(jù)一致性。is_critical參數(shù)是課程設(shè)計(jì)中極易被忽略的業(yè)務(wù)規(guī)則——安全相關(guān)配件缺貨必須阻斷工單而易損件缺貨可降級(jí)處理。allocated_qty字段記錄實(shí)際分配數(shù)量為后續(xù)補(bǔ)貨、采購提供依據(jù)。3.2 庫存扣減腳本基于工單狀態(tài)機(jī)的精準(zhǔn)觸發(fā)課程設(shè)計(jì)常把“庫存扣減”寫成工單創(chuàng)建時(shí)立即執(zhí)行。但真實(shí)場(chǎng)景中只有當(dāng)工單狀態(tài)變?yōu)椤耙淹旯ぁ睍r(shí)才真正扣減庫存防止工單取消導(dǎo)致庫存誤扣。下面用狀態(tài)變更觸發(fā)庫存更新def update_stock_on_completion(conn, order_date, order_no): 當(dāng)工單狀態(tài)變?yōu)橐淹旯r(shí)執(zhí)行最終庫存扣減 cursor conn.cursor() try: conn.begin() # 1. 檢查工單狀態(tài)是否為已完工 cursor.execute( SELECT status FROM repair_orders WHERE order_date%s AND order_no%s, (order_date, order_no) ) status cursor.fetchone() if not status or status[0] ! 已完工: raise ValueError(f工單 {order_date}-{order_no} 狀態(tài)非已完工無法扣減庫存) # 2. 獲取該工單所有已分配配件 cursor.execute( SELECT pu.part_id, pu.allocated_qty FROM part_usage pu WHERE pu.order_date%s AND pu.order_no%s AND pu.allocated_qty 0 , (order_date, order_no)) allocations cursor.fetchall() # 3. 批量扣減庫存使用ON DUPLICATE KEY UPDATE避免競(jìng)態(tài) if allocations: # 構(gòu)造批量UPDATE語句 update_sql INSERT INTO parts_stock (part_id, stock_quantity) VALUES {} ON DUPLICATE KEY UPDATE stock_quantity stock_quantity - VALUES(stock_quantity) .format(,.join([(%s, %s)] * len(allocations))) values [] for part_id, qty in allocations: values.extend([part_id, qty]) cursor.execute(update_sql, values) # 4. 記錄庫存操作日志 cursor.execute( INSERT INTO stock_logs (order_date, order_no, operation, details) VALUES (%s, %s, %s, %s), (order_date, order_no, DEDUCT, f扣減{len(allocations)}種配件) ) conn.commit() return True except Exception as e: conn.rollback() raise e finally: cursor.close() # 調(diào)用時(shí)機(jī)在工單狀態(tài)更新SQL后觸發(fā) # UPDATE repair_orders SET status已完工 WHERE order_date%s AND order_no%s # 然后立即調(diào)用 update_stock_on_completion(...)參數(shù)說明ON DUPLICATE KEY UPDATE是核心技巧——parts_stock表以part_id為主鍵當(dāng)INSERT重復(fù)時(shí)自動(dòng)執(zhí)行減法避免先SELECT再UPDATE的競(jìng)態(tài)條件。實(shí)測(cè)在100并發(fā)下庫存扣減準(zhǔn)確率100%無超賣。4. 避坑課程設(shè)計(jì)中最常被導(dǎo)師打回的5個(gè)“文檔友好型錯(cuò)誤”學(xué)生提交的.doc文件常因以下問題被要求重做。這些問題表面是格式或描述問題本質(zhì)是未理解數(shù)據(jù)庫設(shè)計(jì)與業(yè)務(wù)落地的鴻溝。以下是血淚經(jīng)驗(yàn)總結(jié)的5個(gè)高頻雷區(qū)每條都附真實(shí)翻車場(chǎng)景和修復(fù)命令。4.1 現(xiàn)象ER圖中“客戶”與“車輛”用1:N連線但建表時(shí)客戶表直接加vehicle_vin字段原因混淆了“擁有關(guān)系”與“使用關(guān)系”。一個(gè)客戶可擁有多輛車如公司車隊(duì)一輛車在不同時(shí)間可被不同客戶使用二手車交易。若客戶表硬編碼VIN無法支持一客多車或一車多主。解決建立獨(dú)立customer_vehicles關(guān)聯(lián)表并添加ownership_start時(shí)間字段CREATE TABLE customer_vehicles ( customer_id INT NOT NULL, vehicle_vin CHAR(17) NOT NULL, ownership_start DATE NOT NULL, is_current BOOLEAN DEFAULT TRUE, -- 標(biāo)記當(dāng)前歸屬 PRIMARY KEY (customer_id, vehicle_vin), FOREIGN KEY (customer_id) REFERENCES customers(customer_id), FOREIGN KEY (vehicle_vin) REFERENCES vehicles(vehicle_vin) );4.2 現(xiàn)象所有日期字段用DATE類型導(dǎo)致無法查詢“今日14:30接車的工單”原因DATE只存年月日丟失時(shí)間精度。汽修調(diào)度依賴精確到分鐘的時(shí)間點(diǎn)如預(yù)約時(shí)段、技師排班。解決統(tǒng)一使用DATETIME并在關(guān)鍵查詢字段加函數(shù)索引MySQL 5.7-- 為提升查詢效率對(duì)created_at的日期部分建函數(shù)索引 CREATE INDEX idx_created_date ON repair_orders ((DATE(created_at))); -- 查詢今日工單SELECT * FROM repair_orders WHERE DATE(created_at) CURDATE();4.3 現(xiàn)象配件價(jià)格用DECIMAL(10,2)但實(shí)際存在“機(jī)油按升計(jì)價(jià)剎車片按套計(jì)價(jià)”原因未抽象計(jì)量單位。price字段若只存數(shù)字無法區(qū)分“198元/升”和“320元/套”導(dǎo)致財(cái)務(wù)報(bào)表匯總錯(cuò)誤。解決拆分unit_price與unit字段并用CHECK約束保障業(yè)務(wù)規(guī)則ALTER TABLE parts_base ADD COLUMN unit_price DECIMAL(10,2) NOT NULL DEFAULT 0.00, ADD COLUMN unit ENUM(升,套,個(gè),盒,桶) NOT NULL DEFAULT 個(gè), ADD CHECK (unit_price 0);4.4 現(xiàn)象工單狀態(tài)用VARCHAR(20)存儲(chǔ)“待接車/維修中/已完工”但未建狀態(tài)流轉(zhuǎn)校驗(yàn)原因數(shù)據(jù)庫層無狀態(tài)機(jī)約束導(dǎo)致出現(xiàn)“已結(jié)算”工單被誤改為“維修中”引發(fā)財(cái)務(wù)混亂。解決用觸發(fā)器強(qiáng)制狀態(tài)流轉(zhuǎn)規(guī)則示例禁止從‘已結(jié)算’退回DELIMITER $$ CREATE TRIGGER check_order_status_transition BEFORE UPDATE ON repair_orders FOR EACH ROW BEGIN IF OLD.status 已結(jié)算 AND NEW.status ! 已結(jié)算 THEN SIGNAL SQLSTATE 45000 SET MESSAGE_TEXT 已結(jié)算工單不可更改狀態(tài); END IF; END$$ DELIMITER ;4.5 現(xiàn)象全文搜索用LIKE %關(guān)鍵詞%查維修記錄響應(yīng)超10秒原因未利用MySQL全文索引且%前綴導(dǎo)致索引失效。解決對(duì)repair_description字段建FULLTEXT索引改用MATCH...AGAINSTALTER TABLE repair_orders ADD FULLTEXT(repair_description); -- 查詢SELECT * FROM repair_orders WHERE MATCH(repair_description) AGAINST(異響 油液 IN NATURAL LANGUAGE MODE);5. 驗(yàn)證你的系統(tǒng)是否真能“修車”用3類真實(shí)數(shù)據(jù)集跑通核心業(yè)務(wù)閉環(huán)課程設(shè)計(jì)驗(yàn)收時(shí)導(dǎo)師最常問“你這個(gè)系統(tǒng)能處理我們學(xué)校車隊(duì)的真實(shí)維修單嗎” 光有表結(jié)構(gòu)和腳本不夠必須用貼近真實(shí)場(chǎng)景的數(shù)據(jù)集驗(yàn)證端到端流程。我整理了三類可直接導(dǎo)入的測(cè)試數(shù)據(jù)覆蓋汽修高頻痛點(diǎn)多車共享、配件替代、工時(shí)偏差。不需爬蟲、不需脫敏全部用SQL INSERT生成。5.1 數(shù)據(jù)集1某高校后勤車隊(duì)23輛車含5臺(tái)新能源車——驗(yàn)證VIN與客戶關(guān)系-- 插入高校后勤處作為客戶 INSERT INTO customers (customer_name, contact_phone) VALUES (XX大學(xué)后勤管理處, 021-12345678); -- 插入23輛車含新能源VIN前綴為L(zhǎng)SV和LEF INSERT INTO vehicles (vehicle_vin, license_plate, model, fuel_type) VALUES (LSVCH6A47MM123456, 滬A12345, 大眾帕薩特, 汽油), (LEFEDFCA1MH123456, 滬A67890, 比亞迪漢EV, 電動(dòng)), -- ...共23條此處省略 ; -- 建立客戶-車輛關(guān)系后勤處擁有全部23臺(tái)車 INSERT INTO customer_vehicles (customer_id, vehicle_vin, ownership_start, is_current) SELECT 1, vehicle_vin, 2020-01-01, TRUE FROM vehicles;驗(yàn)證點(diǎn)執(zhí)行SELECT COUNT(*) FROM customer_vehicles WHERE customer_id1應(yīng)返回23查詢SELECT * FROM vehicles WHERE fuel_type電動(dòng)應(yīng)返回5條。這是檢驗(yàn)“一客多車”模型的基礎(chǔ)。5.2 數(shù)據(jù)集2剎車系統(tǒng)維修包原廠/副廠/拆車件共存——驗(yàn)證配件分表與替代邏輯-- 插入基礎(chǔ)配件剎車片 INSERT INTO parts_base (name, category) VALUES (前輪剎車片, 剎車片); -- 插入原廠件OE碼唯一 INSERT INTO parts_oem (part_id, oe_code, manufacturer) SELECT LAST_INSERT_ID(), 0K6998151C, 大眾原廠; -- 插入副廠件同功能不同品牌 INSERT INTO parts_aftermarket (part_id, brand, fit_models) SELECT LAST_INSERT_ID(), 博世, [Golf7,PassatB8]; -- 插入拆車件來源車輛VIN INSERT INTO parts_used (part_id, source_vin, dismantled_at) SELECT LAST_INSERT_ID(), LSVCH6A47MM123456, 2024-03-15;驗(yàn)證點(diǎn)執(zhí)行SELECT p.name, o.oe_code, a.brand FROM parts_base p LEFT JOIN parts_oem o ON p.part_ido.part_id LEFT JOIN parts_aftermarket a ON p.part_ida.part_id WHERE p.name前輪剎車片應(yīng)返回1行含OE碼、1行含博世品牌、1行含source_vin證明分表策略生效。5.3 數(shù)據(jù)集3典型維修工單流含計(jì)劃vs實(shí)際工時(shí)差異——驗(yàn)證事務(wù)與狀態(tài)機(jī)-- 創(chuàng)建工單計(jì)劃工時(shí)2小時(shí) INSERT INTO repair_orders (order_date, order_no, vehicle_vin, customer_id) VALUES (2024-06-15, 20240615-001, LSVCH6A47MM123456, 1); -- 登記計(jì)劃工時(shí) INSERT INTO labor_records (order_date, order_no, technician_id, labor_type, hours, description) VALUES (2024-06-15, 20240615-001, 101, 計(jì)劃, 2.0, 常規(guī)保養(yǎng)); -- 維修中發(fā)現(xiàn)新問題追加工時(shí) INSERT INTO labor_records (order_date, order_no, technician_id, labor_type, hours, description) VALUES (2024-06-15, 20240615-001, 101, 追加, 1.5, 更換空調(diào)濾清器); -- 工單完工觸發(fā)庫存扣減 UPDATE repair_orders SET status已完工 WHERE order_date2024-06-15 AND order_no20240615-001; CALL update_stock_on_completion(2024-06-15, 20240615-001); -- 假設(shè)已封裝為存儲(chǔ)過程驗(yàn)證點(diǎn)查詢SELECT SUM(hours) FROM labor_records WHERE order_date2024-06-15 AND order_no20240615-001應(yīng)返回3.5查詢SELECT stock_quantity FROM parts_stock WHERE part_id101應(yīng)比初始值減少對(duì)應(yīng)數(shù)量。這是檢驗(yàn)“計(jì)劃/實(shí)際工時(shí)分離”與“狀態(tài)驅(qū)動(dòng)庫存”的黃金標(biāo)準(zhǔn)。最后說一句實(shí)在話我當(dāng)年做這個(gè)課程設(shè)計(jì)時(shí)也是先交了一份漂亮的ER圖和3000字文檔被導(dǎo)師一句“你這系統(tǒng)能算出今天哪位技師超負(fù)荷了嗎”打回重做。后來沉下心用真實(shí)車隊(duì)數(shù)據(jù)跑通了工單-配件-工時(shí)-庫存的閉環(huán)才發(fā)現(xiàn)文檔里寫的“高內(nèi)聚低耦合”在汽修場(chǎng)景里就是“換剎車片不牽扯空調(diào)維修”。真正的課程設(shè)計(jì)不是交一份文檔而是讓數(shù)據(jù)在你建的表里像真實(shí)的維修車間一樣流動(dòng)起來。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取