日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
我們?cè)撊绾卧O(shè)計(jì)數(shù)據(jù)庫(kù)(四)

其實(shí)我一直在準(zhǔn)備另一篇博文的基礎(chǔ)資料,但是和朋友聊天,他問(wèn)我最近在做什么,我說(shuō)在做系統(tǒng)Log模塊,并和他交流了一下,于是這篇博客就應(yīng)運(yùn)而生。

所有數(shù)據(jù)都可以用如下形式表述:ID,表名,列名,Value。

比如說(shuō)現(xiàn)在有這么一條數(shù)據(jù)要插入U(xiǎn)ser表:

ID(Guid,這里為了方便理解用Int) Username Password Email
1 CrazyJinn 123456 CrazyJinn@W.C

這一條記錄可以轉(zhuǎn)換為:

ID 表名 列名 Value
1 User Username CrazyJinn
1 User Password 123456
1 User Email CrazyJinn@W.C

你可以在各種對(duì)靈活性要求高的地方看到這種設(shè)計(jì),比如說(shuō)在《我們?cè)撊绾卧O(shè)計(jì)數(shù)據(jù)庫(kù)(三)》的留言中,就有園友提到了類(lèi)似的設(shè)計(jì)。

當(dāng)然,這種方式效率不是很高;不過(guò)可以把聚集索引加到表名上,然后非聚集索引加在列名上,再水平分割一下,如果你心情好,再做個(gè)讀寫(xiě)分離,相信就非高并發(fā)、千萬(wàn)數(shù)據(jù)量級(jí)的應(yīng)用來(lái)說(shuō),理論上還是可以接受的。

好了,現(xiàn)在進(jìn)入正文。

現(xiàn)在要做一個(gè)通用的Log模塊。

既然是通用的,那就意味著靈活性要非常強(qiáng),因?yàn)槟悴恢繪og中要記錄的數(shù)據(jù)結(jié)構(gòu)是如何的。

而且給我的需求有一個(gè)非常變態(tài)的地方:要有回退功能。不過(guò)這個(gè)我們先不去管他。

根據(jù)之前的討論,我們可以很容易設(shè)計(jì)出一張Log表。

ID 表名 列名 Type(Create\Edit\Delete) Value ***修改時(shí)間

如果處理的全是無(wú)關(guān)系的問(wèn)題,這樣做就足夠了。但是要知道,RDBMS,最重要的就是關(guān)系的處理。

比如說(shuō)要Log這樣兩張表:

上文所設(shè)計(jì)出的Log表面對(duì)這樣的一對(duì)多關(guān)系是無(wú)法儲(chǔ)存的,不要往了,我們還有多對(duì)多關(guān)系。

當(dāng)然可以拓展Log表來(lái)實(shí)現(xiàn)儲(chǔ)存一對(duì)多/多對(duì)多關(guān)系,雖然我不確定能不能做到,因?yàn)槲覜](méi)有就這方面去深入的思考。如果您想到了好的設(shè)計(jì),歡迎留言和我探討。

讓我們來(lái)重新思考一下Log模塊的本質(zhì):

1、大量數(shù)據(jù)。

2、只是大量數(shù)據(jù)(和別的模塊沒(méi)有關(guān)聯(lián),純粹的數(shù)據(jù))。

這種場(chǎng)景讓我不由自主的想到了Nosql。在這里,使用MongoDB來(lái)實(shí)現(xiàn)。關(guān)于MongoDB入門(mén),可以參考下面兩篇文章:

祥叔:《MongoDB開(kāi)發(fā)學(xué)習(xí)(1)開(kāi)天辟地,經(jīng)典入門(mén)》

Fish Li:《MongoDB實(shí)戰(zhàn)開(kāi)發(fā) 【零基礎(chǔ)學(xué)習(xí),附完整Asp.net示例】》

MongoDB使用Bson來(lái)儲(chǔ)存數(shù)據(jù),你可以簡(jiǎn)單的把Bson理解為Json。眾所周知,Json是一個(gè)非常易于擴(kuò)充的,松散的的數(shù)據(jù)格式;基于Json易于擴(kuò)充的特性,我們可以這樣來(lái)設(shè)計(jì)Log表

LogID ID 表名 Content(所儲(chǔ)存的內(nèi)容,包含了***修改時(shí)間,修改類(lèi)型,以及新的修改ID)

如果我對(duì)User表修改了6次,那么我們Log的數(shù)據(jù)如下圖:

我們主要把注意力集中在上圖用紅框標(biāo)注的3條數(shù)據(jù)上。

***條數(shù)據(jù),ContactList是一個(gè)Array類(lèi)型,長(zhǎng)度為0,這表示沒(méi)有對(duì)應(yīng)的Contact。

第二條數(shù)據(jù),ContactList長(zhǎng)度變?yōu)?,這表示這次修改為User添加了一個(gè)Contact的關(guān)聯(lián),我們將第二條數(shù)據(jù)完全展開(kāi)來(lái)看:

可以看到,包含了一個(gè)完整的Contact進(jìn)來(lái)。

#p#

第三條數(shù)據(jù)ContactList為Null,這表示我在某個(gè)別的地方修改了User信息。這次修改沒(méi)有涉及Contact,所以保存為Null。當(dāng)我們?nèi)?shù)據(jù)的時(shí)候,如果發(fā)現(xiàn)某個(gè)List為Null,就要遞歸的向上去查找不為Null的數(shù)據(jù)。例如我這里,就要去找到第二條數(shù)據(jù)的ContactList。

為了方便大家理解,我把Json貼在下面。對(duì)照前面的圖片可以很好的閱讀。

 
 
 
 
  1. {  
  2.   "Content" : [{  
  3.       "_id" : new BinData(3, "mtonv7sMCkewsMIjWZ9/qg=="),  
  4.       "Username" : "1",  
  5.       "Password" : "1",  
  6.       "Number" : 1,  
  7.       "LastModified" : new Date("27/11/2012 10:28:18"),  
  8.       "ContactList" : [{  
  9.           "_id" : new BinData(3, "1QwcXGKedUCO27QprZB26Q=="),  
  10.           "UserID" : new BinData(3, "YyQDfuoj6EuuDNl91leigA=="),  
  11.           "Phone" : "Phone1",  
  12.           "Email" : "Email1" 
  13.         }, {  
  14.           "_id" : new BinData(3, "EeWfiFCknkex4H2jEraR/w=="),  
  15.           "UserID" : new BinData(3, "YyQDfuoj6EuuDNl91leigA=="),  
  16.           "Phone" : "Phone2",  
  17.           "Email" : "Email2" 
  18.         }]  
  19.     }, {  
  20.       "_id" : new BinData(3, "Afk3spV0q0uKM+yNs/SHbw=="),  
  21.       "Username" : "1 to 2",  
  22.       "Password" : "1 to 2",  
  23.       "Number" : 2,  
  24.       "LastModified" : new Date("27/11/2012 10:35:03"),  
  25.       "ContactList" : []  
  26.     }, {  
  27.       "_id" : new BinData(3, "H/5o2lizmUWkaxAZUgNHzg=="),  
  28.       "Username" : "2 to 3",  
  29.       "Password" : "2 to 3",  
  30.       "Number" : 3,  
  31.       "LastModified" : new Date("27/11/2012 10:40:28"),  
  32.       "ContactList" : [{  
  33.           "_id" : new BinData(3, "7HDyGU2+A02HbQtUFbOo8A=="),  
  34.           "UserID" : new BinData(3, "H/5o2lizmUWkaxAZUgNHzg=="),  
  35.           "Phone" : "PhoneNew",  
  36.           "Email" : "EmailNew" 
  37.         }]  
  38.     }, {  
  39.       "_id" : new BinData(3, "zf2SiYW81kufGO7ZgY5r3A=="),  
  40.       "Username" : "3 to 4",  
  41.       "Password" : "3 to 4",  
  42.       "Number" : 4,  
  43.       "LastModified" : new Date("27/11/2012 10:41:34"),  
  44.       "ContactList" : null 
  45.     }, {  
  46.       "_id" : new BinData(3, "N68jDslbU0uvdHJTSq0vIg=="),  
  47.       "Username" : "5",  
  48.       "Password" : "6",  
  49.       "Number" : 7,  
  50.       "LastModified" : new Date("27/11/2012 17:14:12"),  
  51.       "ContactList" : null 
  52.     }, {  
  53.       "_id" : new BinData(3, "Fw6OqMNcc0K+rySfgz3dTg=="),  
  54.       "Username" : "9",  
  55.       "Password" : "9",  
  56.       "Number" : 9,  
  57.       "LastModified" : new Date("27/11/2012 17:16:15"),  
  58.       "ContactList" : [{  
  59.           "_id" : new BinData(3, "zfsQRK***0kGFFcnc5TZ9GA=="),  
  60.           "UserID" : new BinData(3, "YyQDfuoj6EuuDNl91leigA=="),  
  61.           "Phone" : "PhoneNew",  
  62.           "Email" : "EmailNew" 
  63.         }]  
  64.     }],  
  65.   "ModelID" : new BinData(3, "YyQDfuoj6EuuDNl91leigA=="),  
  66.   "ModelName" : "User",  
  67.   "_id" : ObjectId("50b4254257751f09a02decba")  

這樣,一個(gè)Log功能的雛形就出來(lái)了

就此擱筆

原文鏈接:http://www.cnblogs.com/CrazyJinn/archive/2012/12/04/2794785.html


網(wǎng)頁(yè)名稱:我們?cè)撊绾卧O(shè)計(jì)數(shù)據(jù)庫(kù)(四)
鏈接URL:http://www.dlmjj.cn/article/djidege.html