【ふくだ学習録】データベースエンジニア養成読本を読んで part5【5日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

# データベースエンジニア養成読本を読んで

### Riakの特徴
Riakの他のNoSQLとの違いは

- **高可用性**
多少のハードウェアやネットワーク故障で停止することなく、どんなときも書き込み読み出しが可能。

- **高信頼性**
多少の不可でもシステムは安定したレスポンスとスループットを提供する。

- **拡張性**
データ量や負荷に応じて、無停止でシステムをスケールアウトできる。

- **低遅延**
どんなときも、ユーザーをまたせずにすぐにレスポンスが得られる。

- **予測可能性**
性能予測を裏切らない。安定したスケールアウト性。

こうやって特徴書いてたら、やっぱりAmazonga作ったデータベースやなってイメージ。

### Riakでできないこと（2013年時点）

- **宣言型言語（SQLなど）による記述性の高いデータモデルとクエリ表現**
- **トランザクション処理**
- **C言語などによるネイティブコードでの実装**

### Elixirとは?
関数型並列処理環境「Erlang仮想マシン」上で動作するプログラミング言語です。「マルチパラダイム」「関数型」「並列プログラミング」「スケーラビリティ」「耐障害性」「Ruby風」などの特徴がある。

### Erlang/OTPとは？
OTPとは「Erlangのライブラリ集」、さらに言えば「それらを用いた並行プログラミングをしていくためのフレームワーク/デザインパターン」。
下記記事が分かりやすかった。（補足しているコメントもあって、それも分かりやすかった）
[Elixir初心者がOTPって結局なんなのか調べてみた](https://qiita.com/kaonash/items/d3678d5635e9d1e57ccf)

下記記事も実戦向きで面白かった。
[Erlang/OTP で作るリアルタイムサーバー](https://speakerdeck.com/yamionp/otp-dezuo-ruriarutaimusaba)

### 2相コミットメントとは？
原子性を確保するための、分散トランザクション制御方法。
下記記事が分かりやすかった。

[分散データベース」を理解する](https://www.atmarkit.co.jp/ait/articles/1703/01/news203_2.html)

### elevelDB、LevelDBとは？
まず、LevelDBとはkey-value型のデータストアの1つ。
[LevelDB入門 (基本編)](https://yosuke-furukawa.hatenablog.com/entry/2014/05/05/095207)

elevelDBは、LevelDB の Erlang バインディング。（Erlangで扱えるようにしたもの、って認識であってるはず）
[Riak docs の LevelDB を意訳してみた](https://qiita.com/na_ga/items/58dd888bf29025163ba0)

### bitcaskとは？
ストレージエンジン名。Riakでデフォルトで使用されているもの。

### 2iとは？
Riak の Secondary Indexing。なかなかに理解むずいけど、下記記事が意訳してくれててかなり助かった。
[Riak docs の 2i を意訳してみた](https://qiita.com/na_ga/items/2cc047c621da286aca44)

### Riakの活用（ショッピングカート編）
Riakではベクタークロックを使用することができる。（デフォルトでは設定されていないため、設定する必要がある）
そのため、それぞれの商品追加タスクを、ベクトル時間上で管理できるため、同時に複数商品の追加タスクを行なったとしても、更新作業が狂うことはなくなる。（起こりにくくなる）（って認識）

### CRDTとは？
「Conflict-free Replicated Data Type」の略で、コンフリクトしない複製可能なデータのこと。
下記サイトが分かりやすく説明してくれていた。神！
[CRDT (Conflict-free Replicated Data Type)を15分で説明してみる](https://qiita.com/everpeace/items/bb73ec64d3e682279d26)

### アクターモデルとは？
並列処理を効率的に実現するための手法の1つ。
下記サイトが分かりやすかった。
[マイクロサービスにも使われている「アクターモデル」による並列処理プログラミング入門](https://tech-lab.sios.jp/archives/8738)

### ガベージコレクションとは？
不要になったメモリ領域を自動的に解放する機能。
[ガベージコレクションはこうすれば理解できる](https://qiita.com/tonkotsuboy_com/items/5bc9ce8bde902022d139)

### ユーザー空間スレッドとは？
まず、メモリ上でOSを動かすために確保する領域を**OS空間**と呼び、OS上でプログラムを実行した時にOS管理下で確保した領域を**ユーザー空間**という。（なるほど）
ユーザー空間スレッドとは、そのユーザー空間で行われるスレッドのこと。

[【図解】初心者向けユーザー空間とカーネル空間,システムコール,MMU/メモリ保護,の仕組み](https://milestone-of-se.nesuke.com/sv-basic/architecture/user-space-kernel-space/)
[マルチスレッドのプログラミング](https://docs.oracle.com/cd/E19455-01/806-2732/mtintro-54820/index.html)

### プロセスとスレッドの違いとは？
プロセスとはプログラムコードやメモリ空間などを含めた実行処理のインスタンス。
スレッドとはプロセス内でメモリを共有し、並行化するためのより細かい単位。
（ここら辺勝手にエイリアスとかやと思ってた…　勉強なるー！）

[Linuxにおけるプロセス/スレッドの調査とか学習とか](http://waysaku.hatenablog.com/entry/2017/03/27/122745)

### 軽量プロセスとは？
プロセス内でスレッドを実現するが、スレッドの実行スケジュールはOSのスケジューラが行うもの。
なのでOSスケジューラから見たら、プロセスとスレッド(LWP)は同じ単位になる。

### ヒープ領域、スタック領域とは？
ヒープ領域は、アプリケーションやOSで動的に割り当てたり解放するもの。
スタック領域は、コンパイラやOSが割り当て、アプリケーションでは自由に操作できない領域。プログラムが内部的にデータを保存しておく必要がある場合に、スタック領域が使用される。

[ヒープとスタック](https://www.uquest.co.jp/embedded/learning/lecture16.html)

### ファイルディスクリプタとは？
プログラムがアクセスするファイルや標準入出力などをOSが識別するために用いる識別子。

[ファイルディスクリプタ (FD)](https://wa3.i-3-i.info/word14383.html)
[ファイルディスクリプタについて理解する](https://qiita.com/toshihirock/items/78286fccf07dbe6df38f)

### Riakを使用するべき場面
他のデータベースで困っていないときは、特に使用しなくてもいい。
「簡単にスケールアウトしたい」とか「ガベージコレクションでシステムが停止してしまう」などといった時に、Raikを使用すると良い。
具体的な条件は下記。

- **データ量が数倍レベルで増減する**
- **簡単にスケールアウトしたい**
- **複数行のトランザクションやJOINがない**
- **スパイク（急激なアクセス増加）時でも安定したレイテンシが欲しい**
- **故障時の運用を簡単にしたい**
- **安心して夜眠りたい**

### Map/Reduceとは？
Hadoopフレームワーク内のプログラミングモデル（パターン）であり、Hadoopファイルシステム（HDFS）に格納されたビッグデータにアクセスするために使用されている。
（おそらく現在では、Hadoopだけで使用されているパターンではなさそう）

[MapReduceと](https://jp.talend.com/resources/what-is-mapreduce/)

### d3.jsとは？
d3.jsは、javascriptからデータを基にSVGを描画するライブラリ。
Data-Driven Documents（データ駆動型ドキュメント）のDをとって、d3と命名されている。

[d3.jsとは](https://qiita.com/nobuyuki-ishii/items/15f9066ec5fa12947b57)

### ER図作成時はwwwsqldesignerを使う
WEbサービスの[wwwsqldesigner](https://ondras.zarovi.cz/sql/demo/?keyword=default)を使用する。
プロダクト作成時だと、エンジニアも非エンジニアで共通認識を持って置かなくてはならないので、両者が気軽に閲覧できる状態でなければならない（と思う）。
プロダクトが成熟（運用フェーズ）になった時に、その他の管理方法にリプレイスするのが一番工数的に良さそう。

### NULLのソート順
MySQLでは最小値、PostgreSQLやOracleでは最大値扱いでソートされる。

### データベースアプリケーションの種類
データベースアプリケーションは2つに大別される。

- **オンライントランザクション処理**
整合性を保ちつつ、かつ頻繁に変更されるデータを格納する場合に向いている。
例：銀行のATMシステム　ネットショッピングの購買システム　等

- **意思決定支援**
膨大なデータを意思決定に活用するよな手法に向いている。
例：売り上げデータを社員別や部門別に分析したり、売れ筋商品を探す時など（検索システムなども多分こっち）


### 第一正規化とは？
RDBにおいて、各フィールドに1つしかデータがない状態にすること。

### 第二正規化とは？
ユニークキーによってテーブルを分割する作業を第二正規化という。

### 第三正規化とは？
1つのフィールドから推移的に別のフィールドの値が分かる場合に、それを別の表に分割する作業を第三正規化という。

### ボイスコッド正規形、第四正規化、第五正規化とは？
この辺りはまとめると長くなるので、割愛する（下記サイトが分かりやすかった）

[第四正規化・第五正規化・ボイスコッド正規化がややこしいので、備忘録として自分なりにまとめてみた(データベーススペシャリストの勉強)](https://www.messiahworks.com/archives/3399)


# 今日の一言
データベースエンジニア読本読み終えた！！すんごい勉強なった！
今度MongoDB使ってアプリ作る！（Firebaseでもいいかも）