Mercurial > hg > Papers > 2017 > tatsuki-master
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については次章で記述する。