亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在數據庫中存儲JSON與為每個密鑰添加一個新列

在數據庫中存儲JSON與為每個密鑰添加一個新列

慕工程0101907 2019-10-24 10:07:42
我正在實現以下用于在表中存儲與用戶相關的數據的模型-我有2列- uid(主鍵),該meta列以JSON格式存儲有關用戶的其他數據。 uid   | meta-------------------------------------------------- 1     | {name:['foo'],        |  emailid:['[email protected]','[email protected]']}-------------------------------------------------- 2     | {name:['sann'],        |  emailid:['[email protected]','[email protected]']}--------------------------------------------------這是一個更好的方式(性能明智的,設計明智)比一列,每個屬性模型,其中表將不得不像許多列uid,name,emailid。我喜歡第一個模型,您可以添加盡可能多的字段,沒有限制。另外,我想知道,既然我已經實現了第一個模型。我該如何對其執行查詢,例如,我想獲取所有名稱如“ foo”的用戶?問題 -使用JSON或每字段列數,哪種更好的方式將用戶相關數據(請記住字段數是固定的)存儲在數據庫中?另外,如果實現了第一個模型,如何如上所述查詢數據庫?我是否應該通過將查詢可以搜索的所有數據存儲在單獨的行中以及將其他數據存儲在JSON(是不同的行)中來使用這兩種模型?更新資料由于將沒有太多列需要執行搜索,因此同時使用兩個模型是否明智?我需要搜索的數據的每列關鍵字和其他人的JSON(在同一MySQL數據庫中)?
查看完整描述

3 回答

?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

像大多數事情一樣,“取決于”。將數據存儲在列或JSON中本身并沒有錯,對錯,好壞。這取決于您以后需要做什么。您訪問該數據的預期方式是什么?您是否需要交叉引用其他數據?


其他人已經很好地回答了技術上的權衡。


沒有多少人討論過您的應用程序和功能會隨著時間的推移發展以及這種數據存儲決策如何影響您的團隊。


因為使用JSON的一種誘惑是避免遷移模式,所以如果團隊沒有紀律,那么很容易將另一個鍵/值對粘貼到JSON字段中。沒有它的遷移,沒有人記得它的用途。沒有驗證。


我的團隊在PostgreSQL的傳統列中使用了JSON,一開始這是自切面包以來最好的方法。JSON具有強大的吸引力,直到有一天,我們才意識到靈活性是有代價的,這突然成為一個真正的痛點。有時,這一點會迅速上升,然后變得很難更改,因為我們在此設計決策的基礎上建立了許多其他功能。


隨著時間的推移,添加新功能以及將數據存儲在JSON中導致的查詢看起來比如果我們堅持傳統列可能添加的查詢更為復雜。因此,我們開始將某些關鍵值返回到列中,以便我們可以進行聯接并在值之間進行比較。餿主意?,F在我們有了重復。新的開發人員會加入并感到困惑嗎?我應該存回哪個值?是JSON還是列?


JSON字段變成了諸如此類的小片段。沒有數據庫級別的數據驗證,文檔之間沒有一致性或完整性。這將所有責任推到了應用程序中,而不是從傳統列中進行困難的類型和約束檢查。


回顧過去,JSON使我們能夠非常快速地進行迭代并獲得成功。太棒了。但是,在我們達到一定的團隊規模之后,它的靈活性也使我們陷入了沉重的技術負擔之中,從而減慢了后續功能開發的進度。請謹慎使用。


認真思考一下數據的本質。這是您應用程序的基礎。隨著時間的推移將如何使用數據。并有可能改變嗎?


查看完整回答
反對 回復 2019-10-24
?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

只是把它扔在那里,但是WordPress具有這種東西的結構(至少WordPress是我觀察到的第一個地方,它可能起源于其他地方)。


它允許無限制的鍵,并且比使用JSON blob更快地進行搜索,但不如某些NoSQL解決方案快。


uid   |   meta_key    |   meta_val

----------------------------------

1         name            Frank

1         age             12

2         name            Jeremiah

3         fav_food        pizza

.................

編輯


用于存儲歷史記錄/多個鍵


uid   | meta_id    |   meta_key    |   meta_val

----------------------------------------------------

1        1             name            Frank

1        2             name            John

1        3             age             12

2        4             name            Jeremiah

3        5             fav_food        pizza

.................

并通過類似這樣的查詢:


select meta_val from `table` where meta_key = 'name' and uid = 1 order by meta_id desc


查看完整回答
反對 回復 2019-10-24
  • 3 回答
  • 0 關注
  • 567 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號