ドキュメントDBの メリット/デメリット 使い方

ドキュメントDBとは何か?

JSONXMLであらわされるドキュメントをベースにしたデータベースのこと。

ここでのドキュメントとは、ヒューマンリーダブルで自己記述的かつ階層構造を持つデータを表す。

ドキュメントDBのメリットは?

  • 木構造で表現できて、普段一度に読み込むデータは、ドキュメントDBとの相性がいいです。

    • バックエンドAPIを作る際に、RDSであれば引っ張り出したデータをJson形式に変形させる必要があるが、ドキュメントDBであればそのままjsonデータをレスポンスするだけでよい。

    • つまり、以下のような木構造であらわせるデータ構造にドキュメントDBは向いている。

  • 学習コストが低い。

  • PoC段階での開発にお勧め。本格稼働させる前にRDSに移設するなどの考えもある。

  • スケーラビリティが高い

    • ドキュメントデータベースは一般的に スケールアウト (Horizontal Scaling) できるように構築されている。

    • つまり、1000を超えるデータベースから一斉にアクセスされても問題なく稼働できる。

ドキュメントDBのデメリットは?

  • 多対多の場面ではドキュメントDBは使うべきでない。

    • なぜならドキュメントDBでは、JOIN文の概念がほとんどなく、アプリケーション側で結合処理を行う必要があるからです

    • つまり、以下のようなテーブルであらわした方がよい場面ではRDBSを使用するべき

  • データの整合性を間違えてはいけないとき

    • 例えば、会計データなどデータに厳密な整合性が必要な時

    • ドキュメントデータベースはデータの挿入時にほかのデータベースとの関係をチェックしない。

    • 対してRDSはデータの挿入時にデータの型、他テーブルの外部参照制約を厳しくチェックしてくれるので、整合性が必要な時はRDSが必須。

  • トランザクション制御が必要な時

    • MongoDBにはトランザクション制御が存在していません

    • ここでも整合性の観点で問題が発生します。

mongo dbを触ってみる

dockerがインストールされている場合は以下のコマンドでmongodbのサンプル使用が可能。

docker run -itd -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=pass -p 27017:27017 --name mongo mongo 

コンテナ内部から操作してみる

docker exec -it mongo bash

コンテナ内部では次のコマンドでmongoshを起動可能

mongosh -u root -p pass

データのinsert

mongoshで次のコマンドを入力。{username;"hashito"}usersデータベースに入れてみる。

db.users.insert({username:"hashito"})
test> db.users.insert({username:"hashito"})

DeprecationWarning: Collection.insert() is deprecated. Use insertOne, insertMany, or bulkWrite.

{

  acknowledged: true,

  insertedIds: { '0': ObjectId("64b79bf00c0aee57e02d824b") }

}

select文(findメソッド)

findメソッドでselect * fromが実行可能。

db.users.find()
test> db.users.find()

[ { _id: ObjectId("64b79bf00c0aee57e02d824b"), username: 'hashito' } ]

test>

update文

mongodbのupdate句は次の通り

db.コレクション名.update({検索条件}, {更新内容})

サンプルコード

db.users.update({username:"hashito"}, {$set:{username:"hashito-v2"}})

実行結果を確認する。

test> db.users.update({username:"hashito"}, {$set:{username:"hashito-v2"}})

{

  acknowledged: true,

  insertedId: null,

  matchedCount: 1,

  modifiedCount: 1,

  upsertedCount: 0

}

page:https://minegishirei.hatenablog.com/entry/2023/07/20/093757