SQL、データベース、DBMS、インデックス

2024.05.14

データベース

データベースとは、作成、読み取り、更新、削除(CRUD)に特化したもの、またその仕組み。またスケール可能で、頻繁にアクセスしても高速に処理できる。

DBMS

Database Management Systemの略。データを扱うためのソフトウェア。DBMSには大きく2種類ある。

RDBMS・・・Relatinal Database Management Systemの略。テーブルと呼ばれる関連データの集合体を使用してデータを保存する。テーブル、行、列の形式。mysql,oracle,sqlite3といったソフトウェアがある。

NoSQL・・・Not only SQLの略。スキーマが無い。柔軟なデータ構造になっている。拡張性や柔軟性に特化しているので大規模データに使われやすい。Firebaseとか。

SQL

データベース内で作成、読み取り、更新、削除(CRUD)を実行可能なコマンド。sqlキーワードは大文字で書くのが一般的らしい。小文字でもできる。

CREATE TABLE songs, artists;

データベース作成時

データベース作成時は以下3つのことを意識するらしい

  • 1テーブルに1つの実体
  • 全てのテーブルは主キーを持つ
  • テーブル内の情報は主キーに依存する

csv

フラットファイルデータベースの一種。

データをシンプルなテキスト形式で格納するデータベース。通常、行(レコード)と列(フィールド)で表す。

name,age,city
Alice,30,New York
Bob,25,Los Angeles
Charlie,35,Chicago

lambda

無名関数。主に一度しか使われない関数を無名関数とすることもある。ただし、複雑な処理の場合は関数を定義するのが良い。

インデックス

インデックスとはテーブル内の情報を取り出す時、よく使用する値だけを取り出して、検索しやすいようにしておいたもの。

CREATE INDEX インデックス名 ON テーブル名(カラム名)

例えばsongsテーブルからnameカラムをよく取り出す処理をよくしていた場合、以下のようにインデックスをはる。.indicesでインデックスの一覧を確認できる。

CREATE INDEX nameindex ON songs(name);

もう一例、顧客テーブルからnamecityの組み合わせをした検索が頻繁に行われるとする。この場合namecityを組み合わせた複合インデックスを作成することで効率的な検索が可能になる。

CREATE TABLE customers (
    customer_id INTEGER PRIMARY KEY,
    name TEXT,
    city TEXT,
    age INTEGER
);

CREATE INDEX namecity ON customers(name, city);
以下のような検索が速くなる
SELECT * FROM customers WHERE name = 'John' AND city = 'New York';

SQLインジェクションアタック

アプリケーションの入力フォームやURLパラメーターなどに不正なSQLクエリを挿入することによって、データベースシステムに対して実行される攻撃手法。データ漏洩、データ改竄、データベースの破壊が可能になる。

対策は入力された値をパラメータ化したりして、直接SQLクエリを実行しないようにすること。

Race Condition

レースコンディションは複数のプロセスが同じリソースに同時にアクセスして実行のタイミングや順序によって予期しない結果が生じる現象。データの不整合が起きたりする。

以下例

初期状態
残高:1000円

トランザクションA
残高を読み取る(1000円)
500円を引き出す(1000円 - 500円 = 500円)
新しい残高(500円)を保存する

トランザクションB
残高を読み取る(1000円)
200円を引き出す(1000円 - 200円 = 800円)
新しい残高(800円)を保存する

レースコンディションのシナリオ
トランザクションAが残高を読み取る(1000円)
トランザクションBが残高を読み取る(1000円)
トランザクションAが残高を更新する(500円)
トランザクションBが残高を更新する(800円)

この結果、最終的な残高が800円になり、トランザクションAが500円引き出したという結果が無視される。本来ならば、500円と200円を引き出した後の残高は300円であるべき。

上記を防ぐため、以下複数の対策がある。

Locks・・・ロック機構を使用して同時に複数の処理がリソースにアクセスしないようにする。ユーザーは待ち時間が発生する。

Transactions・・・一連の処理をアトミックに実行する手法。ユーザーに待ち時間が生まれる。途中で処理が失敗してもデータの整合は保証される。

Atomic・・・アトミックは、操作が「すべて、または何も実行されない」特性を持つこと。つまり中途半端な状態が存在しないことを保証すること。