成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我們該如何設計數據庫(四)

數據庫 數據庫運維
其實我一直在準備另一篇博文的基礎資料,但是和朋友聊天,他問我最近在做什么,我說在做系統Log模塊,并和他交流了一下,于是這篇博客就應運而生。

其實我一直在準備另一篇博文的基礎資料,但是和朋友聊天,他問我最近在做什么,我說在做系統Log模塊,并和他交流了一下,于是這篇博客就應運而生。

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

比如說現在有這么一條數據要插入User表:

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

這一條記錄可以轉換為:

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

你可以在各種對靈活性要求高的地方看到這種設計,比如說在《我們該如何設計數據庫(三)》的留言中,就有園友提到了類似的設計。

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

好了,現在進入正文。

現在要做一個通用的Log模塊。

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

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

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

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

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

比如說要Log這樣兩張表:

上文所設計出的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進來。

#p#

第三條數據ContactList為Null,這表示我在某個別的地方修改了User信息。這次修改沒有涉及Contact,所以保存為Null。當我們取數據的時候,如果發現某個List為Null,就要遞歸的向上去查找不為Null的數據。例如我這里,就要去找到第二條數據的ContactList。

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

  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")  

這樣,一個Log功能的雛形就出來了

就此擱筆

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

責任編輯:林師授 來源: 博客園
相關推薦

2012-04-28 10:07:43

數據庫數據庫設計

2013-03-20 11:25:47

數據庫數據庫設計

2013-03-20 11:33:31

2013-03-20 13:35:12

數據庫數據庫設計

2013-03-20 13:16:15

2011-05-19 11:01:14

ERWin數據庫設計

2023-10-16 09:00:00

數據庫分布式系統

2017-07-06 15:52:22

大數據數據分層數據倉庫

2022-06-30 18:17:00

數據集云數據建模計數據倉庫

2021-10-03 15:00:44

數據庫mysql單機

2020-12-31 05:29:25

數據庫Powerdesign建模

2011-04-12 10:59:46

Oracle數據庫

2018-07-27 06:08:12

2017-11-27 06:01:37

數據庫中間件中間層

2025-04-29 05:00:00

2025-03-27 03:55:00

2017-11-23 15:06:14

前端數據庫開發

2017-11-30 08:56:14

數據庫中間件架構師

2015-06-23 13:56:30

數據庫設計面向對象

2011-08-23 17:45:54

MySQL丟失root密碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄色毛片免费看 | 亚洲高清三级 | 国产欧美在线 | 欧美激情一区二区 | 欧美综合一区 | 黑人久久| 欧美精品综合在线 | 国产激情精品 | 亚洲精品国产成人 | 国产午夜三级一区二区三 | 在线观看国产精品视频 | 爱高潮www亚洲精品 中文字幕免费视频 | 九九在线视频 | av乱码 | 亚洲国产高清免费 | 天天干,夜夜操 | 365夜爽爽欧美性午夜免费视频 | 男人天堂久久 | 久久久久国产一区二区三区 | 国产伦精品一区二区三区精品视频 | 亚洲国产二区 | 东方伊人免费在线观看 | 欧美三级视频 | 成人精品一区二区 | 久久九九免费 | 精品视频一区二区在线观看 | 国产1区2区3区 | 午夜电影在线播放 | 日本一级淫片免费啪啪3 | 久久伊人一区 | 99re热精品视频 | 午夜精品久久久久久久99黑人 | 午夜精品一区二区三区在线播放 | 国产午夜精品理论片a大结局 | 亚洲美女视频 | 久久里面有精品 | 国内精品久久久久久 | 亚洲欧美国产一区二区三区 | 国产一区二区在线播放 | 91 在线| 日韩美女爱爱 |