view databases.tex @ 25:8d1f5ab7b420

fix
author kono
date Sat, 11 Feb 2017 19:04:30 +0900
parents 4d66607c369c
children 4365c210d1cb
line wrap: on
line source

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

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

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

\begin{vervatime}
CREATE TABLE table名 ( \\
\ \ 値の名前 型 制約 , …… \\
) \\
}
の構文で行う。
制約というのは、テーブルに値を入れる際に守らなければならない条件のことである。
値の重複を許さない行を特定する際に用いる{\tt PRIMARY KEY}などがある。
また、テーブル同士は{\tt PRIMARY KEY}を用いて参照を行うことが可能である。


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

\vspace{0.1in}
{\tt
INSERT INTO テーブル名 VALUES( \\
\ \ 格納するデータ \\
); \\
}
の構文で行う。
テーブルにデータを格納する際にはスキーマの定義に沿ってなければならない。
もし、スキーマに反するデータを格納した場合
エラーが発生しデータの格納に失敗する。


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


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

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

PostgreSQLでは、Json形式をJson・JsonBという型を用いて格納する。
Json型は、Jsonデータを文字列で格納し、JsonBはバイナリで格納する。
Json型で格納した場合、データにアクセスするたびにパースする必要がある。
JsonのIndex を張ることが可能になっている。
%JsonのIndexの貼る例題
% Jsonデータのアップデートは、Jsonの大きさnに対してO(n)になってしまう。




\section{MongoDB}
MongoDB\cite{mongo} は2009年に公開された NoSQL のデータベースである。
JSON フォーマットのドキュメントデータベースであり、スキーマレスト呼ばれる。

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

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

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


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

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

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

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


MongoDBは実装にmmapを使用しているため、トランザクションを安全に行うことが難しい。
そのためデータの喪失などが発生することが知られている。

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




\section{Cassandra}
Cassandraは2008年7月にFacebookによって開発された Key-Value なデータベースである。
データは4次元の連想配列のようになっている。
{\tt [KeySpace][ColumnFamily][Key][Column]}\\

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

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

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

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


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

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

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

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

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

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

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

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

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


\section{非破壊的木構造データベースJungle}
Jungleは、当研究室で開発を行っているデータベースで、Javaを用いて実装されている。
Jungleは名前付きの複数の木の集合からなり、木は複数のノードの集合で出来ている。
ノードは自身の子のリストと属性名と属性値の組でデータを持ち、データベースのレコードに相当する。
通常のレコードと異なるのは、ノードに子供となる複数のノードが付くところである。
Jungleでは、親から子への片方向の参照しか持たない。

通常のRDBと異なり、Jungleは木構造をそのまま読み込むことができる。例えば、XMLやJsonで記述された構造を、データベースを設計することなく読み込むことが可能である。
また、この木を、そのままデータベースとして使用することも可能である。しかし、木の変更の手間は木の構造に依存する。
特に非破壊木構造を採用しているJungleでは、木構造の変更の手間はO(1)からO(n)となりえる。つまり、アプリケーションに合わせて木を設計しない限り、
十分な性能を出すことはできない。逆に、正しい木の設計を行えば高速な処理が可能である。

Jungleは基本的にon memoryで使用することを考えており、一度、木のルートを取得すれば、その上で木構造として自由にアクセスして良い。
Jungleは分散データベースを構成するように設計されており、分散ノード間の通信は木の変更のログを交換することによって行われる。
持続性のある分散ノードを用いることでJungleの持続性を保証することができる。
詳しいAPIについては次章で記述する。