iT邦幫忙

3

JSON資料儲存關聯式資料庫(MSSQL)

  • 分享至 

  • xImage

關聯式資料庫有所謂的資料庫正規化,是幫助資料庫設計建置的原理和技術,減少數據冗餘和增進數據一致性(適度的正規化避免所有資料往同TABLE塞)
但如果資料來源是API,給的資料格式是JSON,那有沒有甚麼好的參考依據,心法或心得? (FOR 關聯式資料庫,不會使用NoSQL資料庫)

案例:有2個API,A API和B API(還會有其他資料但先簡化一點)
A API提供學校部類型(日間夜間進修碩士博士...)
B API提供部下的系所資料(資工資管會計統計化學...)
B的API Request需要提供A API的一個結果數值當參數(日間部的所有系所、進修部的所有系所)
這種模式下看起來好像可以A、B API拆不同TABLE,但如果這樣B API資料TABLE又通常需要A API的TABLE資料,這樣使用又每次都要JOIN(或寫成VIEW)
如果不拆TABLE,又好像沒什麼壞處(探討案例的API資料不會無限增長,而是類似上述舉例是有大約固定資料量的)

看更多先前的討論...收起先前的討論...
froce iT邦大師 1 級 ‧ 2024-04-15 09:31:08 檢舉
> 這種模式下看起來好像可以A、B API拆不同TABLE,但如果這樣B API資料TABLE又通常需要A API的TABLE資料,這樣使用又每次都要JOIN(或寫成VIEW)

join就join啊...不知道你在煩惱啥。
你描述的就基本的A B表之間有關聯性,就算不扯到JSON你一樣也是要join。
當欄位固定時,RMDB 跟 JSON 是可以透過序列化和反序列化來轉換的。
RESTfull api的framework也是透過RMDB去做的。
厚厚 iT邦新手 1 級 ‧ 2024-04-15 10:06:43 檢舉
因為對JSON處理的經驗不多,所以想參考大家的想法作法,讓自己思考

一開始想法,就是拆兩個TABLE,因為不同API存不同TABLE感覺很直覺
但發現前手是在接收處理時直接整合一起,再往同一個TABLE塞

在之前版上有人詢問MSSQL關聯的相關問題,發現整合一起其實也滿多人這樣處理的(資料量不大,拆開自找麻煩之類的)
所以才在想是否有不同的經驗分享
froce iT邦大師 1 級 ‧ 2024-04-15 10:22:58 檢舉
往同一表塞是資料量很小,關聯性不複雜的時候可以這樣做。
你如果只有AB表的話那要不要分表作可以商量一下,但,關聯性一複雜你就知道該不該分表了。

這就跟正規化一樣,關係不複雜當然可以隨便做,關係一複雜起來你不分表你還不會做。
那何不一開始就正規化呢?不複雜的話join浪費的資源並不多,複雜起來你還是得要用join。

另外如果是還在寫純SQL的話我是能理解不想多管一個表的想法啦,但如果都是透過ORM的話,麻煩乖乖正規化,尤其是當你還要透過web api輸出的時候。
alien663 iT邦研究生 5 級 ‧ 2024-04-15 10:33:18 檢舉
不JOIN....那你用RDBMS幹嘛
厚厚 iT邦新手 1 級 ‧ 2024-04-15 11:15:41 檢舉
一開始不熟悉的情況下,我單純想要API和TABLE一對一,處理和思考上都很直覺(這邊還沒發現API有關聯)
但會有這次問題的背景是因為前手和之前版上的一些問答(前手這樣做對於程式端的處理也反而要處理更多)
程式有用ORM,所以ENEITY更是直接整合成一個了
加上真實狀況是不只2個API,但API是有階層呼叫的(也就是A結果其中一值要拿去呼叫B,B結果要拿去呼叫C...),而資料的PK都是使用A、B、C都有的CODE,且通常不會單獨使用各API
故在想是因為此原因,才乾脆整在一起,當取用資料時,就能直接用CODE拿到API ABC..的結果
厚厚 iT邦新手 1 級 ‧ 2024-04-15 11:18:48 檢舉
回覆alien663
因為時空背景下,只有使用關聯資料庫,當然NoSQL資料庫就不用想這麼多,但不會因為一個小問題架構就變
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
PPTaiwan
iT邦好手 1 級 ‧ 2024-04-15 14:53:07
最佳解答

先針對你回應的部份 "但公司畢竟不是走在最前面" 那我會建議你 "辛苦一點" 建構好完整個 "關聯式資料庫" 的處理,其他同仁如果不了解一些創新的技術或是公司業務並不需要有多先進的創新技術,那還是保持原有的技術就好,不要太創新!! 因為付薪資給你的是公司,太創新並不是好方法而是大家都同意了才來做。

我做過一個專案,透過某合作廠商將 API JSON 數據讀進來,並在 5~10 秒內將讀到的數據來進行換算(MSSQL 排程+SP)是否有達到 警戒值 當達到警戒值就透過程式發送簡訊請人來處理。

這專案所讀進來的 JSON 都有特定 ID ,讀進來後我將 JSON 用 TSQL 的功能來拆解資料並用 Table 來記錄,每一筆記錄都有 ID 是那一個地方的設備,設備達到設定值的話就進行後續的處理。我這些的處理都是透過 MSSQL SP 來解決掉,導出相關的資料也是透過 SP 將其資料來組合好導出 JSON 內容,程式對資料的處理可以少很多。

會寫 SP 總覺得 VIEW 是沒有用的功能,透過 SP 可以執行 exesql out json 來做資料的交換與處理,當然你文件與註解要寫的好,SP 內的 TSQL Script 要排序好,下一個人接手的人會感謝你

不拆 Table 當然是不建議啦,不為什麼而是公司內容系統都是用 關聯式資料庫-資料庫正規化 的話那就是以原本的方式來做

厚厚 iT邦新手 1 級 ‧ 2024-04-16 09:15:57 檢舉

謝謝回覆,藉由您的說明在配合海大資訊,或許能有不同思維

0
熊熊工程師
iT邦研究生 2 級 ‧ 2024-04-15 11:01:40

關聯式資料庫主要就是在處理結構化的資料,JOIN 的部分是不用擔心效能太差,但也記得在做資料正規化的時候不需要過度正規化。

另外如果你不想寫把每個 JSON 中的資料都拆成一個欄位,或是 JSON 吐回來的資料部會固定的化,是可以直接建立一張資料表,然後開一個欄位,欄位型態選擇 JSON,就可以直接把所有 JSON 型態的資料直接寫進指定欄位裡面,相關的資料可以問 GPT 或 Google,"如何寫入 MySQL JSON 欄位資料" 等等。

至於 JSON 欄位的資料查詢效率我就不太清楚了,是可以查沒錯,但效率的部分如果有大大想補充的話歡迎指教。

針對這種 JSON 格式的資料型態的話,個人這邊是建議直接使用 Mongo,查詢的速度也快,也夠彈性,但還是依開發需求而定。

厚厚 iT邦新手 1 級 ‧ 2024-04-15 11:37:01 檢舉

因為原本API就是提供資料的查詢做後續前端應用,如果欄位型態選擇JSON,在查詢時又要再處理一次或是不直覺,所以也覺得這方式不好

的確API拋回資料是JSON就用MongoDB存就不用在前面想這麼多
但公司畢竟不是走在最前面...

0
海綿寶寶
iT邦大神 1 級 ‧ 2024-04-16 07:37:53

可參考官方教學

厚厚 iT邦新手 1 級 ‧ 2024-04-16 09:14:52 檢舉

謝謝海大,提供資訊,很有收穫

0
obarisk
iT邦研究生 2 級 ‧ 2024-04-16 08:23:28

這個問題沒有標準答案,
我認為只要開發團隊取得共識,然後留下足夠的文件就好

問十個人可能有十個不同的答案

看更多先前的回應...收起先前的回應...
厚厚 iT邦新手 1 級 ‧ 2024-04-16 09:19:28 檢舉

謝謝回覆,在問這問題前也的確沒有要"答案",而是參考前輩經驗思考和接收新知,對之後有機會能改架構時有幫助

obarisk iT邦研究生 2 級 ‧ 2024-04-17 05:49:21 檢舉

所以先問開發團隊


OLTP -> 正規化通常有他的好處
OLAP -> 正規化反正規化都有

資料怎麼存,一定跟他怎麼使用有關。
查詢時 100% 都要 JOIN,這個關連就只有這兩個表本身,沒有其它的表會用到一樣的關連

這個時候正規化只是製造麻煩而已

厚厚 iT邦新手 1 級 ‧ 2024-04-17 09:16:27 檢舉

的確像大大說的,實際案例在使用時是在一個頁面一次使用(資料來源有包含3個API資料)而這些資料其他地方不會有利用到

(但也可能團隊開發風格不同,這次接觸的很少用到DB相關技術,連VIEW也幾乎不用;而之前接觸的錯相對依賴DB端的技術,各有不同)

obarisk iT邦研究生 2 級 ‧ 2024-04-18 23:26:47 檢舉

用不到,就不要用
要用到時再煩惱吧

我要發表回答

立即登入回答