Upgrade to Pro — share decks privately, control downloads, hide ads and more …

アンチパターンから学ぶ RDBの正しい設計 / learn-from-failure-2

アンチパターンから学ぶ RDBの正しい設計 / learn-from-failure-2

soudai sone

March 24, 2019
Tweet

More Decks by soudai sone

Other Decks in Technology

Transcript

  1. 自己紹介 曽根 壮大(34歳) 株式会社オミカレ 副社長/CTO • 日本PostgreSQLユーザ会 勉強会分科会 座長 •

    3人の子供がいます • 技術的にはWeb/LL言語/RDBが好きです そ ね た け と も
  2. 自己紹介 曽根 壮大(34歳) 株式会社オミカレ 副社長/CTO • 日本PostgreSQLユーザ会 勉強会分科会 座長 •

    3人の子供がいます • 技術的にはWeb/LL言語/RDBが好きです そ ね た け と も
  3. RDBMS Model フレームワーク View 情報をやり取りする Modelが事実を加工し、 情報に変更する 事実をやり取りする SQLでやり取りする プログラミング言語

    でやり取りする ORM リレーショナルモデルをプログラミング言語が 扱うオブジェクトモデルに変換する またはその逆を行う
  4. N+1問題 foreach ($blogs as $id => $blog) { echo $blog->get();

    } もしget()の度にSQLが発行されたら?
  5. フレームワーク依存症 名前 トーク評価 理由 好きなDB その他 曽根 壮大 最高 ベストスピーカー

    PostgreSQL soudai1025 最高 なんとなく MySQL Soudai 最高 SQL Server hoge 普通 普通だった Oracle Fuga 悪い その他 Firebird
  6. フレームワーク依存症 名前 トーク評価 理由 好きなDB その他 曽根 壮大 最高 ベストスピーカー

    PostgreSQL soudai1025 最高 なんとなく MySQL Soudai 最高 SQL Server foo hoge 普通 普通だった Oracle Fuga 悪い その他 Firebird アプリケーションのバグで入る
  7. RDBMS View 会員ページ 会員テーブル 会員サービス 会員データ Model ORM SQL 会員リポジトリ

    サービスに必要な ビジネスロジック キャッシュ ストレージ フレームワーク データクラスはサービスが必要な会員の データを取り出し、加工する。 場合によってはキャッシュから取り出し たり、RDBMSから取り出したりする リポジトリクラスはデータのCRUD部分 だけを担う。 ORM経由でもSQLでもサービスクラスか らは関係ない
  8. ロックのレベル 排他ロック(eXcluded lock) 共有ロック(Shared lock) ロック対象へのすべての アクセスを禁止する ロック対象への参照以外の アクセスを禁止する SELECT、INSERT、UPDATE、

    DELETE、すべて実行できない ほかのトランザクションから参照 (SELECT)でアクセス可能 書き込みロック、X lock と呼ばれることもある 読み込みロック、S lock と呼ばれることもある
  9. トランザクションA トランザクションB 2巻を確保 「本の1巻と2巻が揃ったら読む」場合のデッドロック SELECT * FROM book WHERE id

    = 2 FOR UPDATE; SELECT * FROM book WHERE id = 1 FOR UPDATE; 1巻を確保 2巻を確保 1巻を確保 SELECT * FROM book WHERE id = 2 FOR UPDATE; SELECT * FROM book WHERE id = 1 FOR UPDATE; デッドロック発生!
  10. マテリアライズド・ビュー アプリケーション マテリアライズド・ビュー テーブル CREATE MATERIALIZED VIEW ビュー名 AS SELECT文;

    マテリアライズド・ビューは実体な のでINDEXを作成することもできる RDBMS SELECT * FROM マテビュー名 マテリアライズド・ビューを REFRESHするまで作成時の状態
  11. アプリケーションキャッシュ RDBMS アプリケーション データを取り出す SELECT * FROM hoge キャッシュ ファイル

    キャッシュ memcached キャッシュ Redis 任意のデータストアに 取り出したデータを保存する アプリケーションの処理結果を保存することで アプリケーションの再計算処理を省略することもできる
  12. アプリケーションキャッシュ RDBMS アプリケーション RDBMSへのアクセス を減らせる キャッシュ ファイル キャッシュ memcached キャッシュ

    Redis アプリケーションがキャッシュの 振る舞いをコントロールできる RDBMSより高速に取り出せるデータストアに アクセスするため高速に処理できる