---
# System prepended metadata

title: Comparison of noSQL

---

# Comparison of noSQL

Nosql 首先都有一個 primary key 作為資料的索引

| id  | data_address
|---|---
| 1  | 1234 
| 2  | 1235 

NoSQL 有四種分別是
1. Document
2. Column-family
3. Key-value
4. Graph

## 1. Document (Mongodb)

| id  | name | gender | 
|---|---|---|
| 1  | Jimmy | male |   
| 2  | Yvonne | female |   

上面這種表示法沒有講到的是 name, gender 這個 metadata 是如何儲存的
但 Document 的方式是

```
{
    "name": "Jimmy",
    "gender": "male"
},
{
    "name": "Yvonne",
    "gender": "female"
}
```

也就是每一筆資料都會包含 column 的 metadata

### How data storage in disk

我的理解是 Mongodb 也不會真的將每一筆資料儲存成 OS 中的 file, 比如:
```bash
-mongo
      ---user
             ---file1(Jimmy)
             ---file2(Yvonne)           
```

但後來看了這篇文章 [Mongodb 儲存原理](https://zhuanlan.zhihu.com/p/34248254) 才知道是
```bash
-mongo
      ---user.0 (Include Jimmy and Yvonne. Max size 16 MB)
      ---user.1 (Max size 32 MB)
      ---user.2
```

這是文章中的示意圖
```bash
ls -lh  
-rw-------  1 mongo  mongo    16M 11  6 17:24 test.0  
-rw-------  1 mongo  mongo    32M 11  6 17:24 test.1  
-rw-------  1 mongo  mongo    64M 11  6 17:24 test.2  
-rw-------  1 mongo  mongo   128M 11  6 17:24 test.3  
-rw-------  1 mongo  mongo   256M 11  6 17:24 test.4  
-rw-------  1 mongo  mongo   512M 11  6 17:24 test.5  
-rw-------  1 mongo  mongo   512M 11  6 17:24 test.6  
-rw-------  1 mongo  mongo    16M 11  6 17:24 test.ns  
```
## 2. Column-family

這邊介紹一下 Cassandra 及 Bigtable

Gcloud 有一份讓用戶快速理解 Cassandra 及 Bigtable API 差異的文件
https://codelabs.developers.google.com/codelabs/cbt-for-cassandra/index.html#0

### 2.1 Cassandra

https://holajiawei.com/cassandra-arch/

### 2.2 Gcloud bigtable

https://cloud.google.com/bigtable/docs/schema-design

若要設計 timeseries data, 可以將 timestamp 加進 row key 中

比如 user_id + timestamp
```
key value
123#1590328691 []byte
123#1590328692 []byte
```