一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - MongoDB - 初識NoSQL NoSql數據庫入門 NoSql數據庫基礎知識

初識NoSQL NoSql數據庫入門 NoSql數據庫基礎知識

2020-04-28 14:56hebedich MongoDB

大家有沒有聽說過“NoSQL”呢?大家可能會誤以為是“No!SQL”的縮寫,但實際上,它是“Not Only SQL”的縮寫。它的意義是:適用關系型數據庫的時候就使用關系型數據庫,不適用的時候也沒有必要非使用關系型數據庫不可,可以考

做了一年的大一年度項目了,對于關系型數據庫結構還是有些了解了,有的時候還是覺得這種二維表不是很順手。在看過一篇文章之后,對NoSQL有了初步的了解,(https://keen.io/blog/53958349217/analytics-for-hackers-how-to-think-about-event-data)。這篇文章寫的很好,確實寫出來了在實際情況下NoSQL的“用武之地”,而且用了MineCraft作分析,但是也許不夠全面。比如文章中只是提到了,entity數據用關系型怎么存,event數據用NoSQL怎么存,我想借我這篇文章,來分析一下event類型的數據原始的關系型數據庫是怎樣存數據的,然后再對這兩種儲存方式做一種對比,算是對原文都一種補充吧。

對于這種死亡事件,有這樣的兩條數據,一個是關于creeper的爆炸,一種是掉進巖漿。如果必須用關系型二維表數據庫,我會這樣存儲。(如果您還不知道是什么樣的數據,可以先看之后的NoSQL儲存方法,那樣看起來更清楚。)

這種情況的數據可以說是數據庫設計中比較復雜的一種情況了,因為它包含兩種情況(當然不止這兩種情況,那么就會產生更多的結構),不同情況的數據表結構是不同的,這非常麻煩。我們一般的解決方案是設計四個表格,利用關系型數據庫的關系性。設計如下四張表格。(在這里我就簡寫了)

第一張表

?
1
2
3
4
5
6
id #首先用于關聯,主表需要有個id,這個倒不是什么區別,因為NoSQL一般也會有個_id的預設
  timestamp #所有共同部分就可以存在一張表中。
  cause
  player_UID
  player_experience
  player_age    #對于player_inveneory_id 因為這是一個可以任意長度的數組,又只能保存在另一個表中了

第二張表(用于保存creeper死亡方式的死亡事件的)

?
1
2
3
4
5
6
id #這是這張表的id以后可以跟別的表格關聯
  mid #用于關聯主表
  enemy_type
  enemy_power
  enemy_distance
  enemy_age

第三張表(用于保存lava死亡方式的死亡事件的)

?
1
2
3
4
5
id #這是這張表的id以后可以跟別的表格關聯
mid #用于關聯主表
place_x
place_y
place_z

第四張表(用于保存player_inveneory)

?
1
2
3
id #這是這張表的id以后可以跟別的表格關聯
mid #用于關聯主表
inveneory

至此關系性數據庫就將這種有不同結構的事件存放方式規定好了,接下來存放如下(我就不畫表格了)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1.
  id  timestamp          cause    player_UID    player_experience  player_age
  1   "2013-05-23T1:50:00-0600"  "creeper"  "99234890823"   8873729        228   
  2   "2013-05-24T23:25:00-0600"  "lava"   "99234890823"   88737         22
 
2.
  id  mid   enemy_type  enemy_power  enemy_distance  enemy_age
  1   1    "creeper"   .887      3.34       .6677
 
3.
  id  mid  place_x  place_y  place_z
  1   2   45.366   -13.333  -39.288
 
4.
  id  mid  inveneory
  1   1   "diamend sword"
  2   1   "torches"
  3   2   "stone"

至此,我們就用關系性數據庫將這兩個事件數據存下了。(好麻煩是吧!)

我們再看NoSQL的儲存方法,因為每條數據并不受字段(列名)限制,完全可以直接保存,不用分表。(比如JSON格式)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#第一條數據
{
  "timestamp": "2013-05-23T1:50:00-0600",
  "cause":"creeper",
  "enemy":{
    "type":"creeper"
    "power": .887
    "distance_from_player":3.34
    "age":.6677
  },
  "player": {
    "UID":"99234890823",
    "experience": 8873729,
    "age": 228,
    "inveneory":["diamend sword","torches"]
  }
}
#第二條數據
{
  "timestamp": "2013-05-24T23:25:00-0600",
  "cause":"lava",
  "place":{
    x:45.366
    y:-13.333
    z:-39.288
  }
  "player": {
    "UID":"99234890823",
    "experience": 88737,
    "age": 22,
    "inveneory":["stone"]
  }
}

下面我們分析NoSQL對這種數據存放方式的好處

1.首先是把分散的表結構整合了,讓應該在一起的數據在一起了。
這就像C語言中開多個數組儲存還是用一個結構體數組的區別,將一些有關系的數據放在一起是人類一種自然的想法,當然會讓人更加舒服,而且可以提高關聯性和升級擴展的簡易程度。

2.存放變得方便
讓我們來考慮有數據來了我們怎么儲存。
對于二維表數據庫:
    1.分析數據是那種類型的
    2.存放主表數據,并獲得返回id
    3.分支,加上主表id在不同情況下向lava或creeper表中存放數據
    4.開循環,向inveneory表中插入多條記錄
    這還只是一個簡述,還要考慮到對多個表格操作時的數據回滾問題,實際寫起來30行左右,那么出錯的可能就大大提高了。
對于NoSQL類型
    一句話:

 insert(data);#偽碼

其實想想便知道,取數據時原來的關系性數據庫也會同樣麻煩。

3.NoSQL更利于動態生成存放方式,靈活性高了很多,至少我們可以在存放數據的時候再設計數據庫了(雖然可能預先設計會好一些)

當然,如果存儲的不是事件性或者類似此類數據那么就另當別論了,二維表還是有很多它本身的優勢的。以上是我的一些個人的分析,當然還有很多普遍認同的觀點,以下是一些普遍認同的關于兩種數據庫模式的優缺點分析,我也基本同意。

關系性優勢:
    1.事務處理---保持數據的一致性;
    2.由于以標準化為前提,數據更新的開銷很小(相同的字段基本上只有一處);
    3.可以進行Join等復雜查詢。

關系型缺點:
    1. 擴展困難:由于存在類似Join這樣多表查詢機制,使得數據庫在擴展方面很艱難;
    2. 讀寫慢:這種情況主要發生在數據量達到一定規模時由于關系型數據庫的系統邏輯非常復雜,使得其非常容易發生死鎖等的并發問題,所以導致其讀寫速度下滑非常嚴重;
    3. 成本高:企業級數據庫的License價格很驚人,并且隨著系統的規模,而不斷上升;
    4. 有限的支撐容量:現有關系型解決方案還無法支撐Google這樣海量的數據存儲;

NoSQL優勢,主要體現在下面幾點:
    1. 簡單的擴展:典型例子是Cassandra,由于其架構是類似于經典的P2P,所以能通過輕松地添加新的節點來擴展這個集群;
    2. 快速的讀寫:主要例子有Redis,由于其邏輯簡單,而且純內存操作,使得其性能非常出色,單節點每秒可以處理超過10萬次讀寫操作;
    3. 低廉的成本:這是大多數分布式數據庫共有的特點,因為主要都是開源軟件,沒有昂貴的License成本;

NoSQL數據庫還存在著很多的不足,常見主要有下面這幾個:
    1. 不提供對SQL的支持:如果不支持SQL這樣的工業標準,將會對用戶產生一定的學習和應用遷移成本;
    2. 支持的特性不夠豐富:現有產品所提供的功能都比較有限,大多數NoSQL數據庫都不支持事務,也不像MS SQL Server和Oracle那樣能提供各種附加功能,比如BI和報表等;
    3. 現有產品的不夠成熟:大多數產品都還處于初創期,和關系型數據庫幾十年的完善不可同日而語;

延伸 · 閱讀

精彩推薦
  • MongoDBMongoDB安裝圖文教程

    MongoDB安裝圖文教程

    這篇文章主要為大家詳細介紹了MongoDB安裝圖文教程,分為兩大部分為大家介紹下載MongoDB和安裝MongoDB的方法,感興趣的小伙伴們可以參考一下 ...

    Yangyi.He6132020-05-07
  • MongoDBMongodb實現定時備份與恢復的方法教程

    Mongodb實現定時備份與恢復的方法教程

    這篇文章主要給大家介紹了Mongodb實現定時備份與恢復的方法教程,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面...

    chenjsh364522020-05-13
  • MongoDBMongoDB中javascript腳本編程簡介和入門實例

    MongoDB中javascript腳本編程簡介和入門實例

    作為一個數據庫,MongoDB有一個很大的優勢——它使用js管理數據庫,所以也能夠使用js腳本進行復雜的管理——這種方法非常靈活 ...

    MongoDB教程網6982020-04-24
  • MongoDBMongoDB 內存使用情況分析

    MongoDB 內存使用情況分析

    都說 MongoDB 是個內存大戶,但是怎么知道它到底用了多少內存呢...

    MongoDB教程網10002020-09-29
  • MongoDBMongoDB憑什么躋身數據庫排行前五

    MongoDB憑什么躋身數據庫排行前五

    MongoDB以比去年同期超出65.96分的成績繼續雄踞榜單前五,這個增幅在全榜僅次于PostgreSQL的77.99,而其相對于4月份的6.10分的增長也是僅次于微軟SQL Server排名...

    孫浩峰3892020-05-22
  • MongoDB分布式文檔存儲數據庫之MongoDB分片集群的問題

    分布式文檔存儲數據庫之MongoDB分片集群的問題

    這篇文章主要介紹了分布式文檔存儲數據庫之MongoDB分片集群的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋...

    Linux-18743072020-12-20
  • MongoDB遷移sqlserver數據到MongoDb的方法

    遷移sqlserver數據到MongoDb的方法

    這篇文章主要介紹了遷移sqlserver數據到MongoDb的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下...

    聽楓xl9682021-01-03
  • MongoDBmongodb基本命令實例小結

    mongodb基本命令實例小結

    這篇文章主要介紹了mongodb基本命令,結合實例形式總結分析了MongoDB數據庫切換、查看、刪除、查詢等基本命令用法與操作注意事項,需要的朋友可以參考下...

    dawn-liu3652020-05-26
主站蜘蛛池模板: 黑人biglackon10十 | 国产人成激情视频在线观看 | 欧美综合一区二区三区 | 午夜影院h | 欧美又大又粗又长又硬 | 成人看的羞羞视频免费观看 | 99久久综合九九亚洲 | 四虎永久视频 | 52zfl宅福利yxpjw| 日韩欧美一区二区三区免费看 | 暖暖视频免费观看视频中国.韩剧 | 亚洲香蕉网久久综合影院3p | 亚洲国产精品网站久久 | 久久精品人人做人人爽97 | 大ji吧快给我别停受不了视频 | 深夜视频在线播放 | 青青青在线视频播放 | 操女人的b | 乌克兰xxxxx| 四虎在线最新地址公告 | 国产成人精品高清不卡在线 | 欧美日韩精品在线观看 | 1024免费观看完整版在线播放 | 日本一区二区三区国产 | 网站久久| 国产毛片在线观看 | 国产精品美女久久久久网站 | 久久精品免视看国产 | 久久久无码精品亚洲A片软件 | 无人在线高清免费看 | 日本在线视频免费看 | 视频在线91 | 日韩欧美综合在线二区三区 | 成年人网站免费在线观看 | 99国产小视频 | 希岛爱理作品在线观看 | 乌克兰呦12~14 | 日本激情网站 | 亚洲成人综合在线 | 亚洲第9页 | 成版人快猫永久破解版 |