LoginSignup
4
0

More than 3 years have passed since last update.

【4日目】シンプルデータベース実装②

Posted at

まえがき

本日はデータを更新、削除する部分の実装について記載していきます。

  • テーブルを作成する
  • データを挿入する(Done)
  • データを取得する(Done)
  • データを更新する(←今回)
  • データを削除する(←今回)
  • テーブルを削除する

本題に入る前に

昨日、説明不足だった部分を補足します。
まず、シンプルデータベースは射影演算は実装しません。射影演算とは、SQLでいう SELECT Column1, Column2,・・・ のようにSELECTする列を指定する演算です。とりあえず指定されたレコードは全カラムの値返すから、必要に応じてDBの外側でいじってね、という思想です。
また、オブジェクトIDのみでしか、データにアクセスできないような構造にしたのは、選択演算(SQLでいうWHERE句でSELECTするレコードを特定する演算)をオブジェクトIDの論理演算に置き換えられるだろうなーという予想からです。
例えば、値段が100円以上、かつ頭文字が'e'から始まるフルーツは?という条件は

  • それぞれの条件に合致するオブジェクトIDを求める
    • 値段が100円以上 → [0001, 0002, 0003, 0004]
    • 頭文字が'e'から始まるフルーツ → [0002, 0006]
  • そして、オブジェクトID同士の論理演算をする
    • [0001, 0002, 0003, 0004] && [0002, 0006] = [0002]

というようにオブジェクトIDの論理演算に落とし込めます。
テーブル結合はどうすんねん、と思う方がいると思いますが、結合演算はシンプルデータベースでは実装しません。。

さらに、うすうすお気づきの方も多いかもしれませんが、オブジェクトIDのみでしかデータにアクセスできない実装にしたのは、後ほど性能問題などを引き起こします。。
(それでもKVストアにしておけば、スケールさせられるんじゃないか、という淡い期待。)

データを更新する

データの更新は下記の手順で行う。

  1. 更新対象のオブジェクトIDのリストを取得する
  2. 各オブジェクトIDごとに3,4の操作を繰り返す
  3. 更新後値を計算して、キーバリューストアを更新する
  4. 更新対象カラムごとにカラムインデックスを更新前値から更新後値に更新する

例として下記のテーブルのりんごの値段を150円に値上げする。更新された部分は緑色塗り。
image.png

更新前の状態

image.png
image.png
image.png

更新後の状態

image.png
image.png
image.png

データの更新であっても、カラムインデックスにレコードが追加されたり、削除されたりすることに注意。
ちなみに、実装としては、特定カラムの値を定数値に更新することしかできない。(price = price * 1.1などは無理。)

データを削除する

データの削除は下記の手順で行う。
1. 削除対象のオブジェクトIDのリストを取得する
2. 各オブジェクトIDごとに3,4の操作を繰り返す
3. キーバリューストアからレコードを削除する
4. 削除対象カラムごとにカラムインデックスからオブジェクトIDを削除する

例として下記のテーブルからりんごのレコードを削除する。
image.png

削除後

image.png
image.png
image.png

データを削除し、そのデータへの参照も削除するだけ。カラムインデックスにおいては、削除対象のオブジェクトIDをフィルタリングして落とす操作になる。

まとめ

オブジェクトIDのみでしかアクセスできないというデータ構造にすると、やはり更新・削除の操作はめんどくさいです。カラムインデックスもいじらないといけないので。
ただ、各データレコードをオブジェクトIDで抽象化するという思想は良いはずと思って、先に進みます。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0