我們該如何設計資料庫 四

2021-08-27 13:04:19 字數 2348 閱讀 2583

其實我一直在準備另一篇博文的基礎資料,但是和朋友聊天,他問我最近在做什麼,我說在做系統log模組,並和他交流了一下,於是這篇部落格就應運而生。

其實我一直在準備另一篇博文的基礎資料,但是和朋友聊天,他問我最近在做什麼,我說在做系統log模組,並和他交流了一下,於是這篇部落格就應運而生。

所有資料都可以用如下形式表述:id,表名,列名,value。

比如說現在有這麼一條資料要插入user表:

id(guid,這裡為了方便理解用int)

username

password

email

1crazyjinn

123456

[email protected]

這一條記錄可以轉換為:

id表名

列名value

1user

username

crazyjinn

1user

password

123456

1user

email

[email protected]

當然,這種方式效率不是很高;不過可以把聚集索引加到表名上,然後非聚集索引加在列名上,再水平分割一下,如果你心情好,再做個讀寫分離,相信就非高併發、千萬資料量級的應用來說,理論上還是可以接受的。

好了,現在進入正文。

現在要做乙個通用的log模組。

既然是通用的,那就意味著靈活性要非常強,因為你不知道log中要記錄的資料結構是如何的。

而且給我的需求有乙個非常**的地方:要有回退功能。不過這個我們先不去管他。

根據之前的討論,我們可以很容易設計出一張log表。

id表名

列名type(create\edit\delete)

value

最後修改時間

如果處理的全是無關係的問題,這樣做就足夠了。但是要知道,rdbms,最重要的就是關係的處理。

比如說要log這樣兩張表:

上文所設計出的log表面對這樣的一對多關係是無法儲存的,不要往了,我們還有多對多關係。

讓我們來重新思考一下log模組的本質:

1、大量資料。

2、只是大量資料(和別的模組沒有關聯,純粹的資料)。

這種場景讓我不由自主的想到了nosql。在這裡,使用mongodb來實現。關於mongodb入門,可以參考下面兩篇文章:

祥叔:《mongodb開發學習(1)開天闢地,經典入門》

fish li:《mongodb實戰開發 【零基礎學習,附完整asp.net示例】》

mongodb使用bson來儲存資料,你可以簡單的把bson理解為json。眾所周知,json是乙個非常易於擴充的,鬆散的的資料格式;基於json易於擴充的特性,我們可以這樣來設計log表

logid

id表名

content(所儲存的內容,包含了最後修改時間,修改型別,以及新的修改id)

如果我對user表修改了6次,那麼我們log的資料如下圖:

我們主要把注意力集中在上圖用紅框標註的3條資料上。

第一條資料,contactlist是乙個array型別,長度為0,這表示沒有對應的contact。

第二條資料,contactlist長度變為1,這表示這次修改為user新增了乙個contact的關聯,我們將第二條資料完全展開來看:

可以看到,包含了乙個完整的contact進來。

第三條資料contactlist為null,這表示我在某個別的地方修改了user資訊。這次修改沒有涉及contact,所以儲存為null。當我們取資料的時候,如果發現某個list為null,就要遞迴的向上去查詢不為null的資料。例如我這裡,就要去找到第二條資料的contactlist。

為了方便大家理解,我把json貼在下面。對照前面的可以很好的閱讀。

,] 

},,]

},,,]

}],

"modelid"

:newbindata(3,

"yyqdfuoj6euudnl91leiga=="

), "modelname"

:"user"

, "_id"

:objectid(

"50b4254257751f09a02decba") }

這樣,乙個log功能的雛形就出來了

ad:2013大

我們該如何設計資料庫

資料庫該如何設計,一直以來都是乙個仁者見仁智者見智的問題。對於某一種資料庫設計,並不能簡單的用好與不好來區分。或許真的應了那句話,沒有最好,只有最適合。討論某種資料庫設計的時候,應該在某種特定的需求環境下討論。下面來討論一下在專案中經常碰到的使用者的 儲存的問題。我在這裡套用之前網路上流行 普通 文...

我們該如何設計資料庫(一)

資料庫該如何設計,一直以來都是乙個仁者見仁智者見智的問題。對於某一種資料庫設計,並不能簡單的用好與不好來區分。或許真的應了那句話,沒有最好,只有最適合。討論某種資料庫設計的時候,應該在某種特定的需求環境下討論。下面來討論一下在專案中經常碰到的使用者的 儲存的問題。我在這裡套用之前網路上流行 普通 文...

我們該如何設計資料庫 三

簡單的說說吧 假設為man使用者實現的是乙個徵婚系統,而woman使用者實現的是乙個選美系統。這麼說應該能理解man和woman的不能並同一張表的原因了吧。在 我們該如何設計資料庫 二 中,園友jacklondon chen提出了一些問題,大致如下 man woman應該設計在同一張表中。使用者表大...