自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

設(shè)計實例對比:MySQL vs MongoDB

數(shù)據(jù)庫 MySQL 其他數(shù)據(jù)庫 MongoDB
MySQL是關(guān)系型數(shù)據(jù)庫中的明星,MongoDB是文檔型數(shù)據(jù)庫中的翹楚。下面通過一個設(shè)計實例對比一下二者。

MySQL是關(guān)系型數(shù)據(jù)庫中的明星,MongoDB是文檔型數(shù)據(jù)庫中的翹楚。下面通過一個設(shè)計實例對比一下二者:假設(shè)我們正在維護一個手機產(chǎn)品庫,里面除了包含手機的名稱,品牌等基本信息,還包含了待機時間,外觀設(shè)計等參數(shù)信息,應(yīng)該如何存取數(shù)據(jù)呢?

如果使用MySQL的話,應(yīng)該如何存取數(shù)據(jù)呢?

如果使用MySQL話,手機的基本信息單獨是一個表,另外由于不同手機的參數(shù)信息差異很大,所以還需要一個參數(shù)表來單獨保存。

  1. CREATE TABLE IF NOT EXISTS `mobiles` ( 
  2.     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  3.     `nameVARCHAR(100) NOT NULL
  4.     `brand` VARCHAR(100) NOT NULL
  5.     PRIMARY KEY (`id`) 
  6. ); 
  7. CREATE TABLE IF NOT EXISTS `mobile_params` ( 
  8.     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  9.     `mobile_id` int(10) unsigned NOT NULL
  10.     `namevarchar(100) NOT NULL
  11.     `value` varchar(100) NOT NULL
  12.     PRIMARY KEY (`id`) 
  13. ); 
  14. INSERT INTO `mobiles` (`id`, `name`, `brand`) VALUES 
  15. (1, 'ME525''摩托羅拉'), 
  16. (2, 'E7'   , '諾基亞'); 
  17. INSERT INTO `mobile_params` (`id`, `mobile_id`, `name`, `value`) VALUES 
  18. (1, 1, '待機時間''200'), 
  19. (2, 1, '外觀設(shè)計''直板'), 
  20. (3, 2, '待機時間''500'), 
  21. (4, 2, '外觀設(shè)計''滑蓋');   

注:為了演示方便,沒有嚴(yán)格遵守關(guān)系型數(shù)據(jù)庫的范式設(shè)計。

如果想查詢待機時間大于100小時,并且外觀設(shè)計是直板的手機,需要按照如下方式查詢:

  1. SELECT * FROM `mobile_params` WHERE name = '待機時間' AND value > 100; 
  2. SELECT * FROM `mobile_params` WHERE name = '外觀設(shè)計' AND value = '直板';  

注:參數(shù)表為了方便,把數(shù)值和字符串統(tǒng)一保存成字符串,實際使用時,MySQL允許在字符串類型的字段上進行數(shù)值類型的查詢,只是需要進行類型轉(zhuǎn)換,多少會影響一點性能。 www.yzyedu.com

兩條SQL的結(jié)果取交集得到想要的MOBILE_ID,再到mobiles表查詢即可:

  1. SELECT * FROM `mobiles` WHERE mobile_id IN (MOBILE_ID)  

如果使用MongoDB的話,應(yīng)該如何存取數(shù)據(jù)呢?

如果使用MongoDB的話,雖然理論上可以采用和MySQL一樣的設(shè)計方案,但那樣的話就顯得無趣了,沒有發(fā)揮出MongoDB作為文檔型數(shù)據(jù)庫的優(yōu)點,實際上使用MongoDB的話,和MySQL相比,形象一點來說,可以合二為一:

  1. db.getCollection("mobiles").ensureIndex({ 
  2.     "params.name": 1, 
  3.     "params.value": 1 
  4. }); 
  5. db.getCollection("mobiles").insert({ 
  6.     "_id": 1, 
  7.     "name""ME525"
  8.     "brand""摩托羅拉"
  9.     "params": [ 
  10.         {"name""待機時間""value": 200}, 
  11.         {"name""外觀設(shè)計""value""直板"
  12.     ] 
  13. }); 
  14. db.getCollection("mobiles").insert({ 
  15.     "_id": 2, 
  16.     "name""E7"
  17.     "brand""諾基亞"
  18.     "params": [ www.yzjxsp.com 
  19.         {"name""待機時間""value": 500}, 
  20.         {"name""外觀設(shè)計""value""滑蓋"
  21.     ] 
  22. });  

如果想查詢待機時間大于100小時,并且外觀設(shè)計是直板的手機,需要按照如下方式查詢:

  1. db.getCollection("mobiles").find({ 
  2.     "params": { 
  3.         $all: [ 
  4.             {$elemMatch: {"name""待機時間""value": {$gt: 100}}}, 
  5.             {$elemMatch: {"name""外觀設(shè)計""value""直板"}} 
  6.         ] 
  7.     } 
  8. }); 

注:查詢中用到的$all,$elemMatch等高級用法的詳細介紹請參考官方文檔中相關(guān)說明。

MySQL需要多個表,多次查詢才能搞定的問題,MongoDB只需要一個表,一次查詢就能搞定,對比完成,相對MySQL而言,MongoDB顯得更勝一籌。

【編輯推薦】

  1. 教你如何利用MySQL學(xué)習(xí)MongoDB
  2. Craigslist采用MongoDB替代MySQL
  3. MySQL中的NoSQL插件
  4. SQL與NoSQL——MySQL與NoSQL的融合

 

責(zé)任編輯:艾婧 來源: haosola的博客
相關(guān)推薦

2011-08-02 16:08:52

NoSQLMongoDBCassandra

2012-09-07 10:09:54

MySQLMongoDB云計算

2021-12-01 10:18:08

MongoDBMySQL數(shù)據(jù)庫

2014-04-17 10:56:40

優(yōu)化策略MySQL緩存

2019-08-30 08:54:05

TypeScriptJavaScript語言

2021-12-06 20:39:34

AI

2018-01-10 15:03:27

前端TypeScriptJavaScript

2022-08-27 21:31:04

Tauri框架二進制

2025-01-08 08:30:38

2012-03-15 00:06:56

Ubuntu Unity GNOME

2009-12-16 15:49:58

VS 2008性能

2009-12-14 17:04:32

VS 2008專業(yè)版

2023-09-07 14:59:42

物聯(lián)網(wǎng)MQTTCoAP

2024-10-09 11:31:51

2023-06-12 08:00:00

聊天機器人ChatGPT人工智能

2011-03-21 15:08:56

MongoDBCouchDB

2011-08-19 09:06:17

Ubuntu 11.0Windows 7Mac OS X 10

2011-06-29 14:01:30

多數(shù)據(jù)庫實例效率

2017-11-14 18:54:43

MySQLMongoDBNoSQL

2013-11-12 15:34:51

Linux桌面UbuntuWindows
點贊
收藏

51CTO技術(shù)棧公眾號