view databases.tex @ 14:e4da23b04260

commit
author tatsuki
date Wed, 08 Feb 2017 17:26:22 +0900
parents c1d7270965c5
children 33d8077a5d45
line wrap: on
line source

%もう少し詳しく書く
\chapter{既存のデータベース}
本章では、既存のデータベースの例として、PostgreSql・MongoDB・Cassandraについて記述する。

\section{PostgreSql}
PostgreSqlは、列と行からなる2次元のテーブルにより実装されるデータベースである。
厳密な型を持つデータベースであり、きちんと設計を行えば、柔軟なクエリを用いてどんな検索にも対応できる力を持つ。

データベースへのアクセスは、SQLを用いて行う。
データの格納を行う際は、まずテーブルのデータの型と・制約を定義する。
テーブルの定義は、

\vspace{0.1in}
CREATE TABLE table名 ( \\
\ \ 値の名前 型 制約 , …… \\
) \\

の構文で行う。
制約というのは、値の重複を許さない行を特定する際に用いる{\tt PRIMARY KEY}などがある。
また、テーブル同士は{\tt PRIMARY KEY}を用いて参照を行うことが可能である。


テーブルへのデータの格納は、

\vspace{0.1in}
INSERT INTO テーブル名 VALUES( \\
\ \ 格納するデータ \\
); \\

の構文で行う。
テーブルにデータを格納する際にはスキーマの定義に沿ってなければならない。
もし、スキーマに反するデータを格納した場合
エラーが発生しデータの格納に失敗する。
このようにPostgreSqlは、厳密な型に守られている。


作成したテーブルからのデータの取得は、

\vspace{0.1in}
Select 表示する値 FROM テーブル名;\\


の構文で行う。
またテーブル名の後ろに表示する値の絞込や、データの並び替えなどのオプションをつけることも可能である。

PostgreSqlでは、Json形式をJson・JsonBという型を用いて格納する。
Json型は、Jsonデータを文字列で格納し、JsonBはバイナリで格納する。
Json型で格納した場合、データにアクセスするたびにパースするため、非常に処理が重い。
Index を張ることである程度は改善するが、基本的にJsonBで格納したほうが良い。


このようにPostgreSqlは、厳密な型に守られたDBである。
検索時に使用できるオプションも豊富で、欲しいデータを的確に抽出する力がある。
その一方で、データの分割が難しいため、複数のマシンでデータを分割して保持する事が苦手で、
また、格納するデータが複雑な構造だった場合、テーブル設計が煩雑になってしまう問題もある。



\section{MongoDB}
MongoDB は2009年に公開された NoSQL のデータベースである。
JSON フォーマットのドキュメントデータベースであり、スキーマが無い
リレーショナルテーブルに例えられる。

MongoDBでは、テーブルの代わりにコレクションにデータを保持する。
スキーマが無いため、事前にデータの定義を行う必要がなく、同じコレクションであっても、他のドキュメントが持っていないフィルドやデータ型をドキュメントに含めることができる。
そのためリレーショナルデータベースに比べてデータの追加・削除が行いやすい。
コレクションへのデータの格納は、

\vspace{0.1in}
db.コレクション名.insert({Jsonフォーマットで記述されたデータ});\\

の構文で行う。
Json形式のデータは任意の深さまでネストすることが可能である。


作成したコレクションからのデータの取得は、

\vspace{0.1in}
db.コレクション名.find(検索条件,表示する値の絞込);\\

の構文で行う。
引数を渡さなかった場合、コレクションの中身が全て表示される。

MongDBは、あらゆる箇所でJavaScriptを用いており、前述した{\tt insert()}・{\tt find()}といった関数もJavaScriptで実装されている。
dbですらJavaScriptのオブジェクトである。
findで使用するクエリもJavaScriptで記述できる。


このようにMongoDBは、非常に柔軟なデータモデルを扱える。
一方でデータの設計を行わないと、そのパフォーマンスを活かすことはできない。




\section{Cassandra}
Cassandraは2008年7月にFacebookによってオープンソースとして公開された Key-Value なデータベースである。
データは4次元か、5次元の連想配列のようになっている。
4次元の場合、{\tt [KeySpace][ColumnFamily][Key][Column]}・\\
5次元の場合{\tt [KeySpace][ColumnFamily][Key][SuperColumn][Column]} の形で保持している。
しかし、SuperColumn はパフォーマンスが悪く、公式でも使用を推奨していない。
なので、4次元でデータを持つのが主流である。
本論文でも4次元のデータモデルについて記述する。

データを格納する場合初めに、KeySpaceを構築する。
KeySpaceは、

\vspace{0.1in}
create keyspace KeySpace名 with replication = {レプリケーションの設定};\\

の構文で行う。
レプリケーションとは、データベースを別のノードに複製し、データの編集時に同期を取ることである。
障害時に、複製したデータを持つサーバにリクエストを行うことで、データの取得を行える。
データベースに対する負荷が高まった際に、複製を行ったノードに分散を行えるなどのメリットがある。

KeySpaceは、PostgreSqlでいうところのデータベースに近い働きをする。


作成した KeySpace に対してColumnFamily を構築する。
ColumnSpace は、

\vspace{0.1in}
create table テーブル名 (Key Column  PRIMARY KEY, Key Column); \\

の構文で行う。
また、テーブルの定義で最低1つは Key にオプションで PRIMARY KEY を指定する必要がある。
ColumnFamily は、PostgreSql でいうところのテーブルに近い働きをする。

作成したColumnFamily への値の挿入は、

\vspace{0.1in}
INSERT INTO テーブル名 (key1,key2) VALUES (column1, column2);\\

の構文で行う。
また、Cassandra は、PRIMARY KEY で指定した Key で、Column を管理しているため、重複した PRIMARY KEY で 値を挿入すると、データの更新扱いになり上書きされる。

作成した ColumnFamily からのデータの取得は、

\vspace{0.1in}
SELECT 表示する値 FROM テーブル名 オプション;\\

で行う。
またテーブル名の後ろに表示する値の絞込や、データの並び替えなどのオプションをつけることも可能である。