CRUDは、CREATE(作成)、READ(読み取り)、UPDATE(更新)、DELETE(削除)の頭字語です。これらの用語は、主にリレーショナルデータベースやNoSQLデータベースで永続的なデータ要素を作成および管理するための4つの基本的な操作を指しています。
この記事では、CRUD操作がデータ処理にどのように使用されるかについて説明します。また、システム管理者やDevOpsエンジニアがデータベースのモニタリング中に発見する可能性のある問題についても紹介します。
CRUDについて
前述のように、CRUD操作は永続ストレージアプリケーションで使用されるため、システムの電源が切れた後でも、これらのアプリケーションではデータが保持されます。ランダムアクセスメモリーやキャッシュファイルなどの揮発性ストレージに保存されているデータに対する操作とは異なります。
CRUDは、データベースアプリケーションで広く使用されています。これには、Oracle、MySQL、PostgreSQLなどのリレーショナルデータベース管理システム (RDBMS) が含まれます。また、MongoDB、Apache Cassandra、AWS DynamoDBなどのNoSQLデータベースも含まれます。
CRUDと同様の操作は、ファイルなどの永続データ構造に対して実行できます。例えば、Microsoft Wordドキュメントの作成、更新、読み取り、さらにはファイルエクスプローラーからの削除を行うこともできます。ただし、ファイルはレコード指向ではありません(MongoDBやCouchbaseの場合はドキュメント指向ではありません)。CRUDという用語は、フラットファイルの操作ではなく、レコード指向の操作に特に関連しています。
CREATE
CREATE操作では、データベースに新しいレコードを追加します。RDBMSでは、データベーステーブル行はレコードと呼ばれ、列は属性またはフィールドと呼ばれます。CREATE操作では、テーブルに異なるフィールド値を持つ新しいレコードを1つ以上追加します。
同じ原則がNoSQLデータベースにも当てはまります。NoSQLデータベースがドキュメント指向の場合は、新しいドキュメント(属性を含むJSON形式のドキュメントなど)がコレクションに追加されます。これはRDBMSテーブルに相当します。同様にDynamoDBなどのNoSQLデータベースでは、CREATE操作によってアイテム(レコードに相当)がテーブルに追加されます。
READ
READは、検索条件に基づいてデータベーステーブル(あるいはコレクションまたはバケット)のレコード(あるいはドキュメントまたはアイテム)を返します。READ操作は、すべてのレコードと一部またはすべてのフィールドを返すことができます。
UPDATE
UPDATEは、データベースの既存のレコードを変更するために使用されます。例えば、顧客データベースでの住所の変更や、製品データベースでの価格変更などです。READと同様に、UPDATEは条件に基づいて、すべてのレコードに適用したり、一部のレコードにのみ適用したりできます。
UPDATE操作では、レコードの単一のフィールドまたは複数のフィールドを変更し、その変更を永続化することができます。複数のフィールドを更新する場合、データベースシステムはすべてのフィールドが更新されるか、まったく更新されないようにします。一部のビッグデータシステムではUPDATEが実装されず、タイムスタンプ付きのCREATE操作のみが許可され、毎回新しいバージョンの行が追加されます。
DELETE
DELETE操作を使用すると、データベースからレコードを削除できます。完全な削除ではすべてのレコードが削除されます。一方、論理的な削除ではレコードにフラグが付けられますが、レコードはそのまま残ります。例えば、これは従業員が退職した後でも雇用記録を保持する必要がある給与管理で重要になります。
データベースでのCRUDの実行方法
RDBMSでは、CRUD操作は構造化クエリ言語 (SQL) コマンドを介して実行されます。
- CREATEにはINSERTステートメントが使用されます。
INSERT INTO
- READにはSELECTステートメントが使用されます。
SELECT field 1, field 2, …FROM
- UPDATEにはUPDATEステートメントが使用されます。
UPDATE
- DELETEにはDELETEステートメントが使用されます。
DELETE FROM
NoSQLデータベースでのCRUD操作は、特定のデータベースプラットフォームの言語によって異なります。例えば、Cassandra CQLはSQLと非常によく似ています。一方、MongoDBでは、操作は組み込み関数を使用して実行されます。
- CREATEは、
db.collection.insertOne()またはdb.collection.insertMany()を使用して行われます。前者はドキュメントを1つ追加し、後者はデータベースコレクションに多数のドキュメントを追加します。 - READは、
db.collection.find()またはdb.collection.findOne()を使用して行われます。 - UPDATEは、
db.collection.updateOne()、db.collection.updateMany()、またはdb.collection.replaceOne()を使用して行われます。 - DELETEは、
db.collection.deleteOne()またはdb.collection.deleteMany()を使用して行われます。
データベース開発者やDBAは、多くの場合、クライアントツールから手動でデータベースに対してCRUDステートメントを実行します。ただし、ほとんどの本番環境のユースケースでは、これらのステートメントはプログラミング言語のコードに埋め込まれています。プログラムが実行されると、ターゲットデータベースのAPIはCRUDステートメントを受け取り、それをデータベースのネイティブ言語に翻訳します。
例えば、eコマースサイトの訪問者がユーザー登録プロセスを開始すると、PythonまたはJavaで記述されたマイクロサービスが入力値(名、姓、Eメール、住所など)を読み取り、Oracle PL/SQLコマンドを動的に構築できます。その後、このステートメントはOracleドライバーライブラリに送信され、データベースに対して実行されます。
CRUD操作の例
引き続きeコマースストアの例を見ていきましょう。
- ユーザーは、クライアントレコードを作成(CREATE)すると、製品カタログを参照して在庫を読み取る(READ)ことができます。
- ユーザーが注文すると、バックエンドシステムによって、在庫が一時的に更新(UPDATE)され、利用可能なアイテム数の減少が反映されます。
- ユーザーがアイテムを購入すると、更新(UPDATE)は永続的になり、利用可能なアイテム数を読み取って(READ)いる他のユーザーがこの変更を確認できるようになります。一方、別のプロセスによって、配送会社のデータベースにレコードが作成され(CREATE)、発送リクエストが通知されます。
- ユーザーがショッピングカートからアイテムを削除すると、「sales」テーブルに追加された一時レコードが削除(DELETE)されます。
オンライン旅行代理店で、ユーザーが予約リクエストを作成(CREATE)し、リクエストされたルートで利用可能なフライトを読み取り(READ)、購入することができます。これにより、フライトの利用可能な座席のリストが更新され、「itinerary」テーブルに複数のレコードが作成(CREATE)されます。ユーザーがセッションを途中で終了した場合、このトランザクションに関連するすべての行が削除(DELETE)されます。
CRUD操作のテスト
CRUDを含むソフトウェア操作については、通常、ブラックボックステストが実施されます。テスト担当者は、特定の操作を実行する際、意図した変更が行われたかどうか、または正しいデータが返されたかどうかを確認するのに、コードを分析するのではなく、バックエンドデータベースを確認します。このようなテストは、さまざまなシナリオで考えられるさまざまなユーザー操作から生じる各CRUD操作を検証することを目的としています。
CRUDとデータベースのパフォーマンス
最適なCRUD操作の前提条件となるのは、効率性の高いデータベース設計です。データベース設計が適切でないと、CRUD操作がデータベースのパフォーマンスに悪影響を及ぼす可能性があります。
例えば、UPDATEやDELETEなどの操作では、行(およびデータページやインデックスなどの関連リソース)に対する排他ロックが要求されます。ロックによって、もう1つ行が変更されたときに、他のプロセスやユーザーがCRUD操作のためにこれらを取得できなくなります。これにより、データの整合性が確保されます。
レコードの削除中にそのレコードを読み取ったり、2人以上のユーザーが1つのレコードを同時に更新できるようにしたりすることはできません。共有ロックなどの他の種類のロックでは、READの同時実行が可能です。ロックはデータベースレベルまたはステートメントレベルで設定でき、ロックの種類によって、許可されるCRUD操作およびCRUD操作の動作が決まります。
当然ながら、ロックの種類とユーザーセッションによる同時ロックの数は、データベースのパフォーマンスに影響します。例えば、数百または数千人のユーザーが同時に接続する混雑したeコマースサイトでは、多くのロックが同時に動作します。その結果、ユーザーがロックの解放を待つため、応答が遅くなる可能性があります。
このパフォーマンス上の課題が、データベース管理者がCRUD操作をできるだけ早く完了できるよう取り組む理由です。これには、モニタリングソリューションからのフィードバックに基づいたクエリチューニングが必要です。このようなモニタリングソリューションでは、管理者が潜在的なボトルネックを特定するのに役立つ現在のデータベースロック、メトリック、およびログが表示されます。
次世代SIEMおよびログ管理のための世界をリードするAIネイティブプラットフォームをお試しください
SIEMとログ管理のための最高水準のAIネイティブプラットフォーム、CrowdStrike Falcon®プラットフォームでサイバーセキュリティを強化しましょう。ペタバイト規模でのセキュリティログを体験してみてください。クラウドネイティブ型または自己ホスト型での展開が可能です。ボトルネックの生じない、強力でインデックスフリーのアーキテクチャを利用してデータをロギングすれば、1日あたり1PB以上のデータを取り込んで脅威ハンティングに役立てることができます。リアルタイムの検索機能により攻撃者をしのぐスピードで対策を実施できます。複雑なクエリを実行しても、そのレイテンシーは1秒未満です。360度の可視性によりデータを統合してサイロ化を解消し、セキュリティ、IT、DevOpsチームがシームレスに脅威のハンティング、パフォーマンスのモニタリング、コンプライアンスの確保を行うことができます。30億件ものイベントにわたる作業でも1秒未満で実施できます。