畢設(shè)實戰(zhàn):從數(shù)據(jù)建模到全文檢索)
先說一個真實感受畢設(shè)選題這事十個人里有八個是“先選個看起來不難的再做著做著發(fā)現(xiàn)哪哪都是坑”。我當(dāng)時選“材料分析知識系統(tǒng)”這個題目一開始只是覺得Java方向熟、管理系統(tǒng)的套路見得多可真正動手才發(fā)現(xiàn)這個題目比普通的學(xué)生管理系統(tǒng)有意思得多也麻煩得多。它的核心不只是“增刪改查”而是要把材料成分?jǐn)?shù)據(jù)、性能參數(shù)和知識文檔揉進(jìn)同一個系統(tǒng)里讓它們能查、能比、能共享。這篇文章就把我這個項目從設(shè)計到實現(xiàn)的全過程拆開講一遍包括表結(jié)構(gòu)怎么定、導(dǎo)入導(dǎo)出怎么實現(xiàn)、檢索為什么這么難、答辯會被問到哪些點(diǎn)。準(zhǔn)備做Java畢設(shè)的、對知識庫系統(tǒng)感興趣的都能從這里拿走一套完整思路。1. 課題定位與整體設(shè)計思路1.1 材料分析知識系統(tǒng)到底解決什么問題先把這個系統(tǒng)實際要干的活講明白。任何一家做材料加工或檢測的單位手里都攢著一堆牌號資料比如45鋼、Q235、304不銹鋼。每種牌號對應(yīng)一組化學(xué)成分范圍C含量多少、Si含量多少、Mn含量多少以及一組力學(xué)性能指標(biāo)抗拉強(qiáng)度、屈服強(qiáng)度、伸長率、硬度。這些數(shù)據(jù)通常散落在Excel表格、PDF手冊、紙質(zhì)工藝卡里查一種材料要翻好幾個文件。再加上工藝人員平時總結(jié)的經(jīng)驗知識比如“45鋼調(diào)質(zhì)到HRC 22-28的工藝參數(shù)是什么”這些都是有復(fù)用價值的隱形成知識。材料分析知識系統(tǒng)做的事情就是把這些分散的數(shù)據(jù)和文檔集中到一個Web平臺上讓人可以通過牌號、成分范圍、性能指標(biāo)去檢索和對比材料把材料數(shù)據(jù)管起來、把知識共享出去。這也是“材料成分?jǐn)?shù)據(jù)管理與知識共享平臺”和“材料性能知識庫與信息管理系統(tǒng)”這兩個副標(biāo)題的真正含義——前者偏向數(shù)據(jù)資產(chǎn)化后者偏向知識服務(wù)化。畢設(shè)里能把這個定位講清楚答辯就成功了一半因為老師最怕學(xué)生做完一個系統(tǒng)說不清“你解決了誰的問題”。1.2 畢設(shè)選題的價值判斷與邊界控制這個題目的好處是領(lǐng)域特征強(qiáng)不是一個換個皮就能交差的通用管理系統(tǒng)。它有明確的業(yè)務(wù)實體材料、化學(xué)成分、性能指標(biāo)、工藝規(guī)范。有明確的業(yè)務(wù)動作錄入一批材料數(shù)據(jù)按成分篩選合金鋼查看牌號對應(yīng)的性能區(qū)間導(dǎo)出對比報告。這就能在論文里寫出有說服力的研究意義。同時它的工程難度又是可控的不涉及復(fù)雜的算法模型核心還是Web開發(fā)的基礎(chǔ)功CRUD、關(guān)聯(lián)查詢、文件解析、全文檢索。對Java畢設(shè)來說這個難度區(qū)間非常合適。但要注意控制邊界。我見過有人把這類系統(tǒng)往“材料智能推薦”方向做加入一堆機(jī)器學(xué)習(xí)預(yù)測材料性能的內(nèi)容結(jié)果工作量爆炸畢設(shè)周期根本扛不住。我的建議是系統(tǒng)一定要有“知識庫”的質(zhì)感但智能化的部分點(diǎn)到為止。比如做一個“同性能材料推薦”功能按抗拉強(qiáng)度范圍匹配相近牌號這屬于數(shù)據(jù)庫范圍查詢好實現(xiàn)還能講故事。真要上模型做性能預(yù)測那是另一個課題的深度。1.3 系統(tǒng)功能的四層結(jié)構(gòu)我在設(shè)計階段把整個系統(tǒng)拆成四層功能這四層也直接對應(yīng)論文里的功能模塊圖。第一層是數(shù)據(jù)管理包含材料牌號信息管理、化學(xué)成分?jǐn)?shù)據(jù)管理、力學(xué)性能數(shù)據(jù)管理支持單條錄入和Excel批量導(dǎo)入。第二層是知識庫管理包含材料知識文檔上傳、文檔分類、知識條目編輯以及材料與知識文檔的關(guān)聯(lián)綁定。第三層是檢索與共享包含按牌號模糊查詢、按成分范圍篩選、按性能指標(biāo)排序?qū)Ρ?、知識文檔的標(biāo)題和內(nèi)容檢索。第四層是系統(tǒng)支撐包含用戶登錄、角色權(quán)限控制、操作日志記錄。這四個層次是遞進(jìn)關(guān)系。數(shù)據(jù)管理是地基知識庫管理是血肉檢索與共享是價值出口系統(tǒng)支撐是安全底線。畢設(shè)的演示流程也可以按照這個順序來走先錄數(shù)據(jù)、再傳文檔、然后演示檢索和對比邏輯非常順暢。2. Java技術(shù)棧選型與架構(gòu)設(shè)計2.1 技術(shù)選型為什么是Spring Boot MyBatis MySQL技術(shù)選型是答辯必問的點(diǎn)也是很多學(xué)生答得最虛的地方。我這套系統(tǒng)用的是Java 8 Spring Boot 2.7 MyBatis MySQL 8.0前端用的是Thymeleaf模板引擎 Bootstrap jQuery。這套組合在畢設(shè)里幾乎是最穩(wěn)妥的搭配原因有三點(diǎn)。Spring Boot的價值是自動化配置和快速啟動。做畢設(shè)不追求極致的框架深度Spring Boot能讓你在兩天內(nèi)把一個可運(yùn)行的Web項目跑起來把主要精力留給業(yè)務(wù)功能。MyBatis的好處是SQL自己寫對于材料查詢這種有大量條件組合場景的系統(tǒng)特別合適。比如“查詢含碳量在0.30到0.45之間且抗拉強(qiáng)度大于600MPa的材料”在MyBatis的XML里可以用動態(tài)SQL拼條件邏輯一目了然性能也能控制。MySQL這邊沒太多說的中小型管理系統(tǒng)的標(biāo)準(zhǔn)選擇。我見過不少同學(xué)糾結(jié)要不要用Spring Cloud或者微服務(wù)我的建議是千萬別畢設(shè)的核心是業(yè)務(wù)完整度不是技術(shù)架構(gòu)炫技。單體應(yīng)用加清晰的模塊劃分足夠支撐材料知識系統(tǒng)這個體量。2.2 前端方案模板引擎還是前后端分離這是個需要認(rèn)真決策的點(diǎn)?,F(xiàn)在企業(yè)里前后端分離是主流但畢設(shè)場景需要具體分析。如果你做前后端分離意味著要維護(hù)Vue Spring Boot兩套工程接口文檔、跨域配置、Token認(rèn)證這些環(huán)節(jié)都會增加工作量。如果你用服務(wù)端模板渲染一套工程搞定部署也簡單。我最終選了Thymeleaf模板引擎主要原因是這個系統(tǒng)的頁面交互沒有復(fù)雜到必須上前端框架的程度。材料數(shù)據(jù)錄入、查詢列表、知識文檔列表這些都是經(jīng)典的多頁面應(yīng)用場景。用Thymeleaf加少量jQuery的Ajax請求應(yīng)對Excel導(dǎo)入時的進(jìn)度提示和檢索時的局部刷新完全夠用。這個選擇給我省出了至少兩周時間我把這些時間花在了數(shù)據(jù)導(dǎo)入解析和性能查詢優(yōu)化上我覺得這筆交換非常劃算。當(dāng)然你如果對Vue熟練做前后端分離也沒問題答辯時還能多點(diǎn)可講的技術(shù)點(diǎn)。但有一條底線不要讓接口聯(lián)調(diào)吃掉你做業(yè)務(wù)功能的時間那是最虧的。2.3 工程結(jié)構(gòu)與代碼分層規(guī)范代碼分層這事很多同學(xué)不重視但答辯老師翻你源碼時第一個看的就是這個。我采用經(jīng)典的四層結(jié)構(gòu)Controller層負(fù)責(zé)接收請求和參數(shù)校驗Service層負(fù)責(zé)業(yè)務(wù)邏輯編排Mapper層負(fù)責(zé)數(shù)據(jù)庫操作Domain層負(fù)責(zé)實體對象。額外加了一個Common包放統(tǒng)一返回結(jié)果、異常處理、工具類。有一個細(xì)節(jié)值得說一下我把材料牌號實體、化學(xué)成分實體、力學(xué)性能實體做了嚴(yán)格區(qū)分。一開始有人可能會覺得為什么不把成分和性能字段都塞進(jìn)材料表里因為一張表塞太多字段后續(xù)擴(kuò)展會很痛苦比如要加一個“疲勞強(qiáng)度”字段就得改表結(jié)構(gòu)。分開之后一種材料可以對應(yīng)多條成分記錄比如不同標(biāo)準(zhǔn)下的成分范圍對應(yīng)多套性能數(shù)據(jù)比如不同熱處理狀態(tài)下的性能這才是材料數(shù)據(jù)的真實結(jié)構(gòu)。我在答辯時專門講了這一點(diǎn)老師給了肯定。3. 核心功能模塊的實現(xiàn)細(xì)節(jié)3.1 材料牌號與成分?jǐn)?shù)據(jù)管理模塊這個模塊是整個系統(tǒng)的數(shù)據(jù)基礎(chǔ)。材料牌號信息包括牌號名稱、材料類別碳素結(jié)構(gòu)鋼、合金結(jié)構(gòu)鋼、不銹鋼等、統(tǒng)一數(shù)字代號、執(zhí)行標(biāo)準(zhǔn)、適用領(lǐng)域描述?;瘜W(xué)成分?jǐn)?shù)據(jù)則包括元素名稱、最小值、最大值、單位比如C元素在45鋼中就是0.42到0.50單位為%。錄入流程我設(shè)計成兩步先創(chuàng)建牌號基本信息再維護(hù)該牌號下的成分列表和性能列表。這樣做的原因是材料數(shù)據(jù)天然有主從結(jié)構(gòu)一次錄入一個牌號的完整數(shù)據(jù)需要填至少十幾個字段全放在一個表單里頁面會非常長。拆兩步操作上更清晰而且能避免因為某個性能值填錯導(dǎo)致整個表單提交失敗的情況。這個模塊里最有技術(shù)含量的是Excel批量導(dǎo)入。材料行業(yè)里現(xiàn)成的數(shù)據(jù)多數(shù)是Excel表格格式大致是第一列牌號、第二列材料類別、后續(xù)每兩列是一個元素的上下限。我在實現(xiàn)時用EasyExcel解析上傳文件第一步讀取表頭識別元素列第二步逐行讀取數(shù)據(jù)并校驗必填項和數(shù)值范圍第三步將合法數(shù)據(jù)批量插入數(shù)據(jù)庫同時生成一份錯誤報告供用戶下載。導(dǎo)入500條材料數(shù)據(jù)大約需要3到5秒這個速度在畢設(shè)答辯演示時很加分。3.2 性能知識庫與數(shù)據(jù)關(guān)聯(lián)設(shè)計材料性能知識庫存儲的是力學(xué)性能數(shù)據(jù)包括抗拉強(qiáng)度、屈服強(qiáng)度、伸長率、斷面收縮率、沖擊功、硬度等指標(biāo)。每種性能都包含最小值、最大值、測試條件如試樣方向、熱處理狀態(tài)、備注。在數(shù)據(jù)關(guān)聯(lián)上我采用了“性能組”的概念。一種材料可以有多組性能數(shù)據(jù)比如45鋼有正火態(tài)性能、調(diào)質(zhì)態(tài)性能、熱軋態(tài)性能。每組數(shù)據(jù)用“處理狀態(tài)”字段區(qū)分這樣可以實現(xiàn)在查詢時先選狀態(tài)再比性能。這個設(shè)計一開始沒想到是做到中途被一個材料專業(yè)的同學(xué)提醒才補(bǔ)上的。他說你在手冊里查45鋼性能人家都明確標(biāo)著“調(diào)質(zhì)”和“正火”是不同的數(shù)據(jù)你要是不區(qū)分查出來的數(shù)值不專業(yè)。這個點(diǎn)后來成了系統(tǒng)的一個亮點(diǎn)。知識文檔方面系統(tǒng)支持上傳PDF或Word文檔填寫文檔標(biāo)題、摘要、適用材料類別、標(biāo)簽。上傳后文檔與具體材料做關(guān)聯(lián)綁定。比如一份《45鋼調(diào)質(zhì)處理工藝規(guī)程》可以關(guān)聯(lián)到45鋼這個牌號這樣在查看45鋼詳情頁時就能直接看到相關(guān)工藝文檔。3.3 檢索與對比讓材料數(shù)據(jù)用起來查詢功能是材料知識系統(tǒng)區(qū)別于普通管理系統(tǒng)的地方。我做了三條檢索路徑。第一條是牌號模糊搜索輸入“45”就能出來45鋼、45Mn、T45Mn等候選牌號。第二條是成分篩選用戶設(shè)定碳含量在某個區(qū)間、鉻含量大于某個值系統(tǒng)返回符合條件的材料列表。這條路徑在合金鋼篩選場景中非常好用比如要找一個強(qiáng)度高一點(diǎn)但成本不過分高的材料可以按“C 0.3-0.4Cr 1.0-2.0”篩選。第三條是性能對比勾選兩到三種材料表格并排展示它們的關(guān)鍵性能參數(shù)柱狀圖對比抗拉強(qiáng)度或硬度差異。檢索模塊的底層就是MyBatis的動態(tài)SQL核心是根據(jù)前端傳過來的條件對象拼接查詢語句用Mapper XML里的標(biāo)簽控制每個條件是否生效。柱狀圖我用的ECharts從后端返回JSON數(shù)據(jù)前端用它自帶的數(shù)據(jù)渲染能力畫圖。整個過程不復(fù)雜但演示效果好尤其是兩種材料性能差距可視化之后給人的直觀沖擊力比表格大得多。3.4 用戶權(quán)限與操作日志權(quán)限這塊我做了三種角色管理員、材料工程師、訪客。管理員的權(quán)限是全部功能可以管理用戶、刪除數(shù)據(jù)、查看操作日志。材料工程師可以錄入和編輯材料數(shù)據(jù)、上傳知識文檔。訪客只能查詢和瀏覽不能修改任何數(shù)據(jù)。這部分的實現(xiàn)用Spring Boot的攔截器做統(tǒng)一登錄校驗再加一個自定義注解標(biāo)記接口需要的角色權(quán)限。訪客訪問受保護(hù)接口時會被攔截并重定向到登錄頁Ajax請求則返回JSON格式的未授權(quán)提示。操作日志記錄了用戶的關(guān)鍵操作比如登錄、新增材料、修改性能數(shù)據(jù)、導(dǎo)出報告。日志保存到數(shù)據(jù)庫表里管理頁面可以按用戶名和時間段篩選查看。這塊內(nèi)容本身不難但它體現(xiàn)了一個管理系統(tǒng)的完整性而且論文里可以寫一段“系統(tǒng)安全性設(shè)計”屬于低成本高收益的部分。4. 數(shù)據(jù)庫設(shè)計材料領(lǐng)域的數(shù)據(jù)建模要點(diǎn)4.1 核心表結(jié)構(gòu)與字段設(shè)計數(shù)據(jù)庫設(shè)計是材料知識系統(tǒng)的靈魂這塊設(shè)計得好不好直接影響后面所有功能的實現(xiàn)復(fù)雜度。我設(shè)計了十張核心表這里挑最關(guān)鍵的六張說明。材料表records記錄牌號基本信息核心字段包括材料ID、牌號名稱、材料類別、標(biāo)準(zhǔn)號、應(yīng)用領(lǐng)域、創(chuàng)建人、創(chuàng)建時間?;瘜W(xué)成分表chem_composition記錄元素成分字段包括ID、材料ID、元素名稱、最小值、最大值、單位。性能表mech_property記錄力學(xué)性能字段包括ID、材料ID、性能名稱、最小值、最大值、測試條件、處理狀態(tài)。4.2 材料關(guān)聯(lián)關(guān)系的建模思路文檔表knowledge_doc存儲知識文檔信息字段包括文檔ID、標(biāo)題、摘要、文件路徑、上傳人、上傳時間、下載次數(shù)。文檔關(guān)聯(lián)表doc_material_ref是文檔和材料的中間表一個文檔可以關(guān)聯(lián)多個材料一個材料也可以關(guān)聯(lián)多個文檔。用戶表sys_user保存用戶賬號密碼密碼用MD5加鹽存儲字段包括用戶ID、用戶名、密碼、真實姓名、角色、狀態(tài)。這個表結(jié)構(gòu)看起來簡單但有兩個容易忽略的地方。第一個是成分和性能都用了“最小值/最大值”這對字段而不是單一數(shù)值。因為材料標(biāo)準(zhǔn)里的成分范圍本來就是區(qū)間值如果只存一個值查詢“碳含量在0.3到0.45之間”就沒法精確匹配。第二個是doc_material_ref這張中間表有了它知識文檔和材料之間才能構(gòu)成多對多關(guān)系這也是“知識共享”四個字落到數(shù)據(jù)庫層面的具體體現(xiàn)。4.3 索引優(yōu)化與查詢性能數(shù)據(jù)量上來之后查詢性能就成了問題。我做了幾項索引優(yōu)化。材料表的牌號字段建了普通索引支撐模糊查詢時能走索引范圍掃描。成分表的材料ID字段建了索引支撐通過材料查成分的常用路徑。成分篩選場景是查詢壓力最大的因為要掃描所有材料的成分記錄并按區(qū)間匹配我在元素名稱和元素值上加了一個聯(lián)合索引實測數(shù)據(jù)量到五千條材料時查詢性能從跑秒級提升到了毫秒級。還有一個面試?yán)锍R姷膬?yōu)化也推薦做把用戶表這類低頻變化的數(shù)據(jù)放到獨(dú)立緩存里我用Spring Cache在登錄和權(quán)限校驗時做了簡單的本地緩存避免每次都查數(shù)據(jù)庫。但要注意別把材料數(shù)據(jù)也盲目緩存因為材料數(shù)據(jù)時有更新緩存一致性處理不好反而更麻煩。5. 關(guān)鍵功能實現(xiàn)從代碼邏輯看系統(tǒng)運(yùn)轉(zhuǎn)5.1 Excel導(dǎo)入的解析流程與校驗策略Excel批量導(dǎo)入是材料數(shù)據(jù)管理模塊最核心的代碼場景。解析流程我用偽代碼描述一下就清楚了接收上傳文件后先做文件大小和格式校驗然后在內(nèi)存中解析整個工作簿把表頭行映射成字段名列表。接下來循環(huán)每個數(shù)據(jù)行逐字段做類型校驗比如元素含量必須是數(shù)字最小值和最大值不能填反。校驗通過的行封裝成實體批量調(diào)用Mapper插入校驗失敗的行記錄錯誤原因和行號最后生成一個包含成功數(shù)和錯誤明細(xì)的結(jié)果對象返回給前端。有個細(xì)節(jié)必須提醒你批量導(dǎo)入時要注意事務(wù)邊界的設(shè)定。我一開始把解析和入庫放在一個大事務(wù)里結(jié)果有一條數(shù)據(jù)格式錯就導(dǎo)致五百條全回滾白折騰半小時。后來改成解析階段不開啟事務(wù)入庫階段分批提交每批一百條這樣單條錯誤只影響本批數(shù)據(jù)錯誤報告還能準(zhǔn)確指出是哪一批出了問題。5.2 成分篩選查詢的動態(tài)SQL實踐成分篩選是體現(xiàn)MyBatis動態(tài)SQL價值的地方。前端頁面有幾個下拉框和輸入框分別對應(yīng)元素類型和數(shù)值區(qū)間。后端接收一個Condition對象里面包含若干鍵值對。在Mapper XML里我用標(biāo)簽遍歷條件列表逐個拼接到WHERE子句后。寫這個功能最容易踩的坑是元素動態(tài)列拼接。比如用戶同時篩選碳含量和鉻含量生成的SQL需要同時JOIN兩次成分表。我一開始用子查詢實現(xiàn)每一種元素一個子查詢材料數(shù)量少的時候還行數(shù)據(jù)到兩千條以上就明顯變慢。后來改成對每種篩選元素LEFT JOIN一次用CASE WHEN做條件過濾性能穩(wěn)定了很多。這個優(yōu)化記得在論文的“系統(tǒng)優(yōu)化”章節(jié)里寫一筆。5.3 知識文檔上傳與全文檢索實現(xiàn)知識文檔管理的上傳流程比較簡單表單提交文檔標(biāo)題、摘要、標(biāo)簽和文件后端保存文件到服務(wù)器磁盤目錄把文件路徑和元數(shù)據(jù)寫入數(shù)據(jù)庫。下載時根據(jù)文件路徑讀取流返回給瀏覽器同時更新下載次數(shù)。檢索這塊值得展開說。我最初用的LIKE模糊匹配字段少的時候夠用但知識文檔多了以后用戶搜“調(diào)質(zhì)硬度”這種復(fù)合詞時匹配很尷尬。后來我引入了一個輕量級的倒排索引方案自己實現(xiàn)了一個簡單的分詞器把文檔標(biāo)題和摘要按常見分隔符切分后建索引表。檢索時先分詞再查索引相關(guān)性排序簡單按命中次數(shù)算。效果雖然比不上Elasticsearch但在幾千篇文檔的規(guī)模下體驗已經(jīng)不錯。如果時間充裕接入Elasticsearch也是個加分項但要注意服務(wù)器內(nèi)存消耗畢設(shè)演示環(huán)境帶不動ES的情況我見過不少。6. 畢設(shè)實戰(zhàn)中的常見問題與排錯經(jīng)驗6.1 數(shù)據(jù)庫時區(qū)與中文編碼問題這套系統(tǒng)開發(fā)中我遇到的第一批坑就是環(huán)境類的。MySQL 8.0的默認(rèn)時區(qū)是UTC而Spring Boot連接時用的本地時區(qū)會導(dǎo)致數(shù)據(jù)庫里的時間字段和頁面顯示的時間差8小時。處理辦法是在JDBC連接串上顯式指定serverTimezoneAsia/Shanghai同時數(shù)據(jù)庫連接參數(shù)加上characterEncodingutf8和useSSLfalse。中文亂碼問題排查起來要三層位置都檢查數(shù)據(jù)庫表的字符集、JDBC連接參數(shù)、前端頁面的meta聲明。三層字符集保持一致亂碼問題基本不會出現(xiàn)。6.2 數(shù)據(jù)量大時的導(dǎo)入卡頓與內(nèi)存溢出Excel導(dǎo)入在數(shù)據(jù)量大時有兩個隱患。第一個是EasyExcel雖然本身就是流式解析但如果數(shù)據(jù)量超過幾萬行仍要關(guān)注內(nèi)存占用建議把解析批大小調(diào)小一點(diǎn)。第二個是導(dǎo)入時別一次性把所有數(shù)據(jù)裝進(jìn)一個List后再批量插入我踩過OOM的坑。后來改成讀取一批插入一批每批200條Java堆內(nèi)存設(shè)為512MB時實測導(dǎo)入兩萬條材料數(shù)據(jù)穩(wěn)定完成耗時在二十秒左右。6.3 答辯前值得深挖的五個技術(shù)問題答辯時老師往往會挑幾個實現(xiàn)細(xì)節(jié)深入問提前準(zhǔn)備好能大幅度提高答辯表現(xiàn)。第一個是“材料數(shù)據(jù)的成分范圍查詢?nèi)绾螌崿F(xiàn)”你要能講清楚動態(tài)SQL拼接和LEFT JOIN的思路。第二個是“為什么選擇MyBatis而不是MyBatis-Plus”你要能說明手寫SQL對復(fù)雜查詢的可控性。第三個是“索引設(shè)計有哪些依據(jù)”把聯(lián)合索引設(shè)計思路和查詢場景說清楚。第四個是“Excel解析的流程與異常處理”把解析、校驗、分批提交的流程講明白。第五個是“知識庫與普通文件管理的區(qū)別在哪”突出篩選、關(guān)聯(lián)、共享這些知識組織層面的能力。我踩過的一個比較隱蔽的坑是分頁查詢里關(guān)聯(lián)表數(shù)據(jù)重復(fù)比如材料表和成分表JOIN后一頁十條數(shù)據(jù)每一條都重復(fù)了多次。原因是查的是材料列表卻選了成分表的字段導(dǎo)致結(jié)果集膨脹。解決思路是查出當(dāng)前頁的材料ID列表后再按ID批量查詢關(guān)聯(lián)數(shù)據(jù)在主內(nèi)存中做組裝避免JOIN分頁的經(jīng)典問題。做完整套系統(tǒng)我最大的感悟是畢設(shè)選題選得好不好有時候比做得累不累更重要?!安牧戏治鲋R系統(tǒng)”這個題目勝在領(lǐng)域真實、業(yè)務(wù)有深度、技術(shù)棧經(jīng)典做出來的成果不光能答辯還能寫進(jìn)簡歷當(dāng)作項目經(jīng)歷。你做完之后一定會發(fā)現(xiàn)自己對Spring Boot的理解、對數(shù)據(jù)庫設(shè)計的理解比上課時那些練習(xí)題帶來的進(jìn)步大多了。材料數(shù)據(jù)的魅力在于它有真實世界的那種不規(guī)整感——有區(qū)間、有條件、有關(guān)聯(lián)處理好這些不規(guī)整知識系統(tǒng)才真正立得起來。最后再分享一個小建議完成一個模塊就及時做一次功能自測和界面截圖最后寫論文時你會特別感謝自己這個習(xí)慣。