Mercurial > hg > Papers > 2017 > tatsuki-master
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 テーブル名 オプション;\\ で行う。 またテーブル名の後ろに表示する値の絞込や、データの並び替えなどのオプションをつけることも可能である。