iT邦幫忙

0

網站前端查詢資料改成不用資料庫查詢

  • 分享至 

  • xImage

最近發現資料庫如果改成自訂義的檔案方式~
由原先前端下條件搜索資料庫的資料,改成搜索檔案的資料~變很快
覺得這應該是ASP.Net才能做得到吧@@..PHP好像不能這麼做?
想問習慣PHP的人~會有這種寫法嗎?

我先說目前環境→補習班→需要匯出每個月課表供學生選課
學生可以在課表上進階搜尋任何條件查詢資料~
以往都是要下SQL條件查詢資料庫後,才把想要的課表資料帶出來~
但因為課表的資料已經累積10年左右了(不可以刪除舊課表資料)
滿龐大的= =...

於是我改了一個做法~就是先匯出最近2個月的課表到文字檔案
文字檔案的內容是存Json格式 [{...},{...},{...},{...}]
如果老師有異動課表資料,就會更新文字檔案的內容~

然後我再把Json檔案的資料讀到網頁的課表顯示
學生若要搜索課表的條件,也可以在這個Json檔案範圍內搜索~
網頁讀取速度滿快的呢@@...

概念作法
DB→Json檔案→網頁顯示

實作方式

Dim Json_LessonUrl As String = "https://........../Lesson.json"
Dim Json_LessonStr As String = func.GetWebTxt(Json_LessonUrl, 65001)

'建立自定義的表格
Dim table As New System.Data.DataTable
table.TableName = "Lesson"
Dim idColumn As System.Data.DataColumn = table.Columns.Add("Lesson_ID", GetType(Integer))
table.Columns.Add("Lesson_Date", GetType(Date))
table.Columns.Add("Lesson_Time", GetType(String))
table.Columns.Add("TeacherName", GetType(String))
table.Columns.Add("Lesson_Title", GetType(String))
table.Columns.Add("Lesson_Notes", GetType(String))

'將資料寫入自訂義表格
Dim JArray_Obj As Newtonsoft.Json.Linq.JArray = Newtonsoft.Json.Linq.JArray.Parse(Json_LessonStr)
For j = 0 To JArray_Obj.Count - 1
    Dim Lesson_ID As String = Replace(Newtonsoft.Json.JsonConvert.SerializeObject(JArray_Obj(j).Item("Lesson_ID")), """", "")
    Dim Lesson_Date As String = Replace(Newtonsoft.Json.JsonConvert.SerializeObject(JArray_Obj(j).Item("Lesson_Date")), """", "")
    Dim Lesson_Time As String = Replace(Newtonsoft.Json.JsonConvert.SerializeObject(JArray_Obj(j).Item("Lesson_Time")), """", "")
    Dim TeacherName As String = Replace(Newtonsoft.Json.JsonConvert.SerializeObject(JArray_Obj(j).Item("TeacherName")), """", "")
    Dim Lesson_Title As String = Replace(Newtonsoft.Json.JsonConvert.SerializeObject(JArray_Obj(j).Item("Lesson_Title")), """", "")
    Dim Lesson_Notes As String = Replace(Newtonsoft.Json.JsonConvert.SerializeObject(JArray_Obj(j).Item("Lesson_Notes")), """", "")
    table.Rows.Add(New Object() {Lesson_ID,Lesson_Date,Lesson_Time,TeacherName,Lesson_Title,Lesson_Notes})
Newx
table.AcceptChanges()

'條件搜索
Sql = "1=1 "
If Today_yn > 0 Then
   Sql &= " and Lesson_Date = '" & Now.Date & "'"
End If
If Keyword_Date <> "" Then
   Sql &= " and Lesson_Date = '" & Keyword_Date & "'"
End If
If Keyword_Teacher <> "" Then
   Sql &= " and TeacherName like '%" & Keyword_Teacher & "%'"
End If
If Keyword_Title <> "" Then
   Sql &= " and Lesson_Title like '%" & Keyword_Title & "%'"
End If
Dim LessonTable() As System.Data.DataRow = table.Select(Sql)

'最後顯示資料
For k = 0 To LessonTable.Length - 1
   Dim Rs As System.Data.DataRow = LessonTable(k)
   xxxxxx....略
Next

這個概念就跟硬碟資料抓到記憶體類似啊
不過很懷疑你這樣的資料量叫大?
我這寫法只是概念的@@~
真正的寫法~欄位超多的...而且檔案大概會匯出1~2萬多筆課程暫存0.0|||
那個Json檔大小~約100MB左右~
打雜工 iT邦研究生 1 級 ‧ 2021-02-07 00:43:26 檢舉
php可以這麼做,我會評估很多面向來決定是否這樣做,各有優、缺點。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
EN
iT邦好手 1 級 ‧ 2021-02-05 10:51:27
最佳解答

不考慮把 10 年的課表資料拆成多個 Database 嗎 @@

看更多先前的回應...收起先前的回應...

恩@@~這是好方式~
不過維護上~會比較麻煩吧...

froce iT邦大師 1 級 ‧ 2021-02-05 11:18:46 檢舉

不用分拆全部10年的,你把最近幾個月的弄個cache資料表,如果cache找不到再找全部的就好。
這樣搞不好會比你現在的作法還好,也容易維護。

froce
我倒是想把資料庫跟前端查詢者隔離呢~
也就是我將資料庫停用休息一陣子~
網頁顯示資料也依然正常運作呢@@a

froce iT邦大師 1 級 ‧ 2021-02-05 11:35:13 檢舉

那是你的資料不夠複雜,有些系統join來join去又where來where去再group的,你這樣做會做死。

然後你要這樣乾脆就把近兩個月的json用ajax丟到前端就好,丟給前端去做篩選,也比你在後端跑迴圈浪費伺服器資源好...

算了,你覺得好就好。
我是沒辦法給正解啦,不過我很想給海綿寶寶正解。XD

EN iT邦好手 1 級 ‧ 2021-02-05 11:36:28 檢舉

我還是不覺得這是好解法,如果要這樣做,乾脆將全部的資料都輸出成 JSON 檔。這樣做也不需要後端,直接在 JS 中用 fetch 的方式讀檔就好惹。

EN iT邦好手 1 級 ‧ 2021-02-05 11:37:39 檢舉

froce
我們的想法一樣 XDDD
BTW:
關於 Fetch ,可以參考該連結

沒關係~我在觀察看看這方式是否可行@@~
目標是降低伺服器、資料庫的負擔...

直接在 JS 中用 fetch 的方式讀檔就好惹
喔~~這全都在前端做~好方法XD

2
海綿寶寶
iT邦大神 1 級 ‧ 2021-02-05 11:26:34

PHP好像不能這麼做?

不僅PHP可以這麼做
能拿來寫查詢資料庫網頁的程式語言都能這麼做

想問習慣PHP的人~會有這種寫法嗎?

這寫法跟 ASP.NET/PHP 沒有關係
跟程式設計的人的想法有關係

這大概不是你想聽的答案

你想聽的答案是

改善程式執行效能 維持資料正確性,查詢又變快 這真是一個好做法

選我正解

哈~我其實是想要資料庫能在停用一陣子的時候~
網站依然正常運作XD

#過年要到了~主機資料庫可以關機休息了~

主機資料庫可以關機休息了

Web Server 表示:不公平,為什麼我沒有休息
/images/emoticon/emoticon21.gif

我要發表回答

立即登入回答