NoSQL ── 非リレーショナル型データベースの総称
SNS、 ログ、 IoTセンサ、 商品カタログなど、 形が不定/量が膨大/更新が高頻度なデータでは NoSQL が定番。 統計分析でも、 SSDSE のような構造化データは RDB、 ツイートやJSON系は NoSQL、 と使い分けます。
4タイプの直感:
| タイプ | イメージ | 用途例 |
|---|---|---|
| Key-Value | 巨大な辞書 {キー: 値} | セッション、 キャッシュ |
| Document | JSON文書の集まり | 商品カタログ、 ユーザープロフィール |
| Column | 列単位で格納、 列数可変 | ログ、 時系列、 大量センサデータ |
| Graph | ノードとエッジ | SNSの友人関係、 知識グラフ |
SNSデータでのMongoDB例:
{
"_id": "post_123",
"user": "alice",
"text": "今日は晴れ #weather",
"tags": ["weather"],
"likes": 42,
"replies": [
{"user": "bob", "text": "ですね"}
]
}
RDBなら「投稿テーブル」「タグテーブル」「返信テーブル」と分割して JOIN が必要。 NoSQL なら1ドキュメントで完結。
最小限のスニペットで動作確認できる例。 公的データ(SSDSE 等)を想定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # MongoDB を pymongo で使う from pymongo import MongoClient client = MongoClient("mongodb://localhost:27017/") db = client["sns"] posts = db["posts"] # 挿入:辞書をそのまま入れられる posts.insert_one({"user": "alice", "text": "hello", "likes": 0}) # 検索:MongoDB クエリ言語 result = posts.find({"likes": {"$gte": 10}}).sort("likes", -1).limit(5) for doc in result: print(doc) |
分散DBは「分断耐性」を諦めるわけにはいかず、 必然的に C か A のどちらかを譲歩することになる。
分散DBは「分断耐性」を諦めるわけにはいかず、 必然的に C か A のどちらかを譲歩することになる。
RDB なら 3 テーブルに分けて JOIN する SSDSE-B-2026 も、 NoSQL のドキュメント DB なら都道府県ごとに 1 ドキュメントとして埋め込み構造で保管できる。
| NoSQL分類 | 代表製品 | データモデル | SSDSE-B 適用例 |
|---|---|---|---|
| ドキュメント | MongoDB, Couchbase | JSON 文書 | 都道府県ごとに統計値を埋め込み |
| キー・バリュー | Redis, Memcached | key→value | 集計結果のキャッシュ |
| 列指向 | Cassandra, HBase | 行 ×列ファミリ | 時系列の年次データ |
| グラフ | Neo4j, ArangoDB | ノード・エッジ | 都道府県の隣接関係・人流 |
| 全文検索 | Elasticsearch | 逆インデックス | 行政文書検索 |
| 時系列 | InfluxDB, TimescaleDB | 時間軸 | IoT センサー |
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 34 35 36 37 38 | # SSDSE-B-2026 → MongoDB 投入
import pandas as pd
from pymongo import MongoClient
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
df_2023 = df[df['年度']==2023]
client = MongoClient('mongodb://localhost:27017/')
col = client['ssdse']['prefectures']
col.delete_many({}) # idempotent
# 都道府県 1 ドキュメント、 年度を配列でネスト
for pref, sub in df.groupby('都道府県'):
doc = {
'_id': sub.iloc[0]['地域コード'],
'prefecture': pref,
'years': [
{'year': int(r['年度']),
'population': int(r['総人口']),
'aged_pop': int(r['65歳以上人口']),
'births': int(r['出生数'])}
for _, r in sub.iterrows()
]
}
col.insert_one(doc)
# クエリ: 2023年の高齢化率トップ5
result = col.aggregate([
{'$unwind': '$years'},
{'$match': {'years.year': 2023}},
{'$project':{'prefecture':1,
'ratio': {'$multiply':[
{'$divide':['$years.aged_pop','$years.population']},100]}}},
{'$sort': {'ratio': -1}},
{'$limit': 5}
])
for r in result: print(r)
|
分散システムでは Consistency(整合性)/Availability(可用性)/Partition Tolerance(分断耐性)のうち 2 つしか同時に満たせない(CAP 定理)。 NoSQL は AP(可用性+分断耐性)に振った設計が多い。
| DB | 選択 | SSDSE-B 用途への向き不向き |
|---|---|---|
| RDB (PostgreSQL) | CP | 集計・JOIN中心ならOK |
| MongoDB | CP / AP切替 | ネスト構造で読み出し高速 |
| Cassandra | AP | 時系列の年次データの大量書き込み向き |
| DynamoDB | AP (Eventual) | 読み込み主体、 スパイク耐性 |
| Redis | CP / Single | キャッシュ・ランキング |
SSDSE-B-2026 のように列構造が安定し集計中心のデータは RDB/DWH が向く。 IoT センサーやログのような列が増減・スキーマが揺れるデータは NoSQL が向く。