20210225・26_アウトプット(データベース・SQL)
2/25行ったこと 合計5時間
昨日のアウトプット…1時間
”マンガでわかるデータベース”を初めから終わりまで見た(インプット) …4時間
👉Railsの仕組みに頼ってSQLについて、きちんと理解していないと感じたため。
👉自分はSQLについてどの部分を特に理解していないのか確認するため。
2/26行ったこと
- アウトプット…4時間30分
👉記事で言語化してみたら昨日のインプットしたところでも読めていなかった部分に気づけた。
学んだこと
- 2/25行ったこと 合計5時間
- 2/26行ったこと
- 学んだこと
- (1)データベースって何だろう?
- (2)リレーショナルデータベースて何だろう?
- (3)データベースを設計しよう
- (4)データベースを利用しよう-SQLの基本操作
- (5)データベースを運用しよう
- (6)データベースの普及と活躍
(1)データベースって何だろう?
データベースはデータを共有して、活用すること。
ファイルやアプリケーションによる管理と違い、矛盾(修正のずれ)や重複(同じようなデータをそれぞれ管理)を防ぐことができる。
ただし、データベースを大人数で使うにはルールが必要!(データを読み書きできる権限・タイミング。データが破壊された時の回復の仕組み。データを高速に検索する仕組み。)
(2)リレーショナルデータベースて何だろう?
リレーショナルデータベースでは、数学上の概念に基づいた計算でデータを操作できるようになっている。(8つ)
この8つの演算を組み合わせてデータを操作することができる。
NO | 名前 | 内容 |
---|---|---|
1 | 和(union) | 2つの表に含まれる「行」を全て抽出する演算(対象分の表のレコードを重複なく、くっつける) |
2 | 差(defference) | 2つの表同士の差分(どちらの表を基準にするかによって得られる回答が違うのがポイント) |
3 | 積(intersection) | 2つの表どちらにも共通するもの(”かつ”) |
4 | 直積(Cartesian product) | 2つの行の”組み合わせ”を重複なく全て合わせる方法 |
5 | 射影(projection) | 列を抽出する(その列の中身を表示する。each メソッドが浮かんだ) |
6 | 選択(selection) | 行を取り出す |
7 | 結合(join) | 表をつなぎ合わせる(リファレンスの概念が必要なことがポイント!) |
8 | 商(division) | 割られる方の表から、悪方の表の全ての行を含むものを取り出し、そこから割る方の行を除く演算 |
- 「???」となったのが「商」。
- 「3×2=6」(直積)の場合は当然、6÷2=3になる(商)、つまり商演算は直積演算と対照的な存在となる。
(1)割る表の行と共通している割られる行を抽出。
(2)(1)の行から、割る表の列を取り除いたものを抽出。
(3)その結果が”商”と理解。
👉つまり、割る方と割られる方で列の数が違う。
👉最終的には、割り算の答えを出すわけではなく、「割る行」と一致している「割られる表にある行」を取り出し、さらに、「割る行にはない列」を答えとして出すものと理解。
(3)データベースを設計しよう
どれだけ表を実体(Entity)と関連ごと(Relationship)に細分化できているかを、第1〜第3正規形まで段階分けされていることを知った😲
(今まで意識せず、第一から第三に飛んでいた)
項目 | 内容 | 例 |
---|---|---|
第一正規形 | 1行に1つの値が入るようにして分割すること | 売上表・売上明細表 |
第二正規形 | 主キーが決まると他の列の値が決まるように表を分けること | 売上表・売上明細表・商品表 |
第三正規形 | 主キー以外によって他の列が決まらないようにすること | 売上表・売上明細表・商品表・輸出表 |
(4)データベースを利用しよう-SQLの基本操作
SQLとはデータベースとの対話のこと。
3つの役割があることをおさらい。
(1)表を作成する
(2)データを入力する・取り出す
(3)ユーザーを管理する1つの対話を”文”という。
LIKE句について、「ホニャホニャ」したい部分を「%」にすると理解。(りんご → %ご)
1文字にマッチしているか知りたい場合にはアンダーバー
_
。( _ム → ハム)
SELECT文
項目 | 役割 |
---|---|
SELECT | どのカラムにする? |
FROM | どの表の話? |
WHERE | どういう条件で? |
集計関数
- 上記プラスアルファーで、取り出したデータの値を集計する機能もある(SELECT文とごっちゃになっていたことに気づく)
集計関数 | 意味 |
---|---|
COUNT(*) | 行は何行ある? |
COUNT(列名) | 空の値を除いて、行は何行ある? |
COUNT(DISTINCT 列名) | 空の値と、重複行を除いて、行は何行ある? |
SUM(列名) | 各行の合計値は? |
AVG(列名) | 各行の平均値は? |
MAX(列名) | 各行で一番大きい値は? |
MIN(列名) | 各行で一番小さい値は? |
正規表現を使って分けた表からデータを取得するにはコツがいる
(2)の第三正規表現まで分けた表を複数使って、データを取得したい場合には、「表をつなげる」「主キーとそれを参照している外部キーは正しいよ」と条件をつける必要がある!
つなげる👉コンマ
主キーとそれを参照している外部キーは等しいよ👉表と列名をピリオドでつける
どうやって表を作るの?
CREATE TABLE
文を使う!「それは文字列?数値?」と値の種類を指定したり、「それは最大何文字にする?」と値の範囲を指定したり、「その中でも主キーはこのカラムだよ」と
PRIMARY KEY
を指定したりする。
どうやって行を追加するの?
INSERT
文を使う!
INSERT INTO 表(カラム名A,カラム名B) VALUES(100,'メロン')
表の「カラムAに100という数字をいれる」「カラムBにメロンという文字列をいれる」という意味になる
内容 | 文 |
---|---|
挿入 | INSERT INTO |
変更 | UPDATE |
更新 | DELETE FROM |
他にも複雑な問合せ方法がある
項目 | 内容 | 備考 |
---|---|---|
副問合せ | 問い合わせの中に別の問い合わせを埋め込むこと | ()内 のSELECT文の結果が、()外 のSELECT文に渡されて検索される |
相関副問合せ | 副問い合わせ外で指定された表を使えること | ()外 に別の表を定義、それを()内 で呼び出しして使用。内外共通で使われることがポイントなので、内側の問い合わせを単独で問い合わせすることができない |
(5)データベースを運用しよう
一番知って感動した「トランザクション」(”読み出し””書き出し”等、意味のあるデータ操作の単位のこと)
大勢の人で利用しながらもデータに矛盾が生じないのはこの仕組みのおかげ!!!
性質 | 内容 | 意味 |
---|---|---|
A(Atomicity)アトマシティ | 原子性 | コミットかロールバックのいずれかで終了する |
C(Consistency)コンシスタンシィ | 一貫性 | データに矛盾が起こらないようにする |
I(Isolation)アイソレーション | 独立性 | 複数のトランザクションが並列処理されても、「はいストップ!」としたタイミングに複数の処理が同じ結果になるような仕組みにすること |
D(Durability)デュアビリティ | 耐久性 | 完了したトランザクションの内容が障害によって損なわれないようにする |
ロックによる制御
最も使われている方法として、データを読み出す際には「共有ロック」、データを書き込む際には「排他ロック」をかける方法がある。
「排他ロック」をかけないと、どの書き込みが最新なのか分からなくなってしまい、最終的なデータの状態が正しく保てなくなるよ!
2相ロック
ロックの設定と解除の規約(ルール)の一つ。
AとBの二つのロックをかける対象があったときに、「Aロックをかける Bロックをかける」「Aロックを解除 Bロックを解除」という順番を守ること。
「Aロックをかける Aロックを解除」「Bロックをかける Bロックを解除」の順番にしてしまうと、Aのロックを解除した結果とBのロックを解除した結果がごっちゃになってしまい、どちらが最新版なのか分からなくなるよ!(=直立可能性が保証されないためNG)
ロックの粒度に注意
ロックの粒度 | トランザクションにロックをかける時間 | トランザクションを解除する時間 |
---|---|---|
大きい | 減る(CPUの負荷少ない) | 増える(鍵よ早く解除してくれ〜の数が増えるため) |
小さい | 増える(CPUの負荷大きい) | 減る(一部しか鍵かけてないから再開も早い) |
その他の同時実行制御
その他 | 内容 |
---|---|
時刻印制御 | トランザクションがアクセスするデータにタイムスタンプを与える。読み書きしようとしたトランザクションよりも新しいタイムスタンプのトランザクションがあったら読み書きを許可しない(ロールバック)する仕組みのこと |
楽観的制御 | とりあえず、みんな読み出ししていいよと許可する方法。書き込みをする時点で初めて、他のトランザクションによってデータが更新されていないか確認をする仕組みのこと |
索引を使って高速に検索
どれだけ処理時間を要するかも大事なポイント
新しく知った単語「B木」
下記の記事のおかげで、二分探索木
の3以上の数字版という意味だと理解できた。
障害回復
まずどんな障害が考えられる?
項目 | 内容 |
---|---|
トランザクション障害 | トランザクションを完了できないこと |
システム障害 | 停電などによってシステムがダウンした場合のこと(通常、障害発生時にコミットしていないトランザクションはロールバックを行い、コミット済みのものはロールフォワードを行う) |
媒体障害 | ハードディスクの損傷(バックアップを元に処理。処理内容も上記と同じくどの時点までコミットされているかどうかで判断) |
チェックポイントと復旧
データベースへの書き込みを効率するよくするため、バッファと呼ばれる一時的にデータを記録する場所を作り、ある程度たまったら書き込みする、という方法がある。
「ある程度たまったら書き込みする」の「書き込みする」部分のタイミングをチェックポイントという。
チェックポイントにおいて、コミットがきちんと終わっているものはロールフォワードを行い、終わっていないものはロールバックする必要がある。
チェックポイントの意味が、この記事面白くてわかりやすかった
(6)データベースの普及と活躍
初めて知った単語「ストアドプログラム」
通信量を抑える(その都度、SQL文でDBへ問い合わせをしなくていいようにする)ために、データベースサーバに予めプログラムを組んでおくこと
ストアドプログラム | 内容 | 例 |
---|---|---|
ストアドプロシージャ | 処理手続きからの戻り値を持たないプログラム | 従業員を追加したときにその従業員の役職によって権限を与える |
ストアドファンクション | 処理手続きからの戻り値を持つプログラム | リターンで、社員番号から従業員を探したときにいなかったら「該当なし」と値を返す |
トリガ | データベースに操作を行う前後に起動されるプログラム | 誰かが注文をしたときに、自動的に在庫を減らして発送処理まで行う |
例について誤っていたら教えて欲しいです💦
感想
アソシエーションのおかげで、リファレンスや、「1対1」「1対多」「多対多」などは理解していた。
今まで、Railsを通して主にモデルが、MySQL(DB)に対して、やりとりをしてくれていて(メソッド等)、その表面部分しかわかっていなかったんだと気づけた。
具体的にはその先に、8つの演算をベースにデータの新規作成・削除・更新を行っていたり(表もあれば行もある)、必要なデータを引っ張って持ってきたり、運んだり、トランザクションによって回復できる状況を維持していたりすると学んだ。
特にトランザクションの仕組みは全く意識しておらず、よくよく考えたらエクセルで言う”読み取り専用”や、いろんな人が更新するにはタイミングちゃんと決めないとシステムとして成り立たないなとか気付きがあり面白かった。
思い通りにデータベースを操ることが出来たらどれだけ楽しいだろうか😍と思った。SQL好きかも。サーバーサイドエンジニアにとって、要となってくると思うため、もっと知りたいと思った。
全体の概念をざっくり理解したので、明日からはドリルを行って、実際に手を動かしながらデータベース操作してみる!