\documentstyle[a4j,graphicx]{jarticle} \title{データベースシステム} \author{久保正明} \date{6/14/2001} \begin{document} \maketitle \section{データベースとは} コンピュータのエンジニアでなくとも、データベースという言葉を聞いた事は あるでしょう。また気付かないうちにほとんどの人が日常的に利用していること でしょう。例えば預金残高を間違いなく記憶してくれている銀行口座は巨大なデー タベースですし、電話番号案内サービスでオペレータが即座に電話番号を調べて くれるのも、データベースを使っているからです。このようにコンピュータによっ て沢山のデータを管理し、簡単に目的のデータを探し出すことのできる仕組みを データベースと言います。 今日、コンピュータが行っている業務のうち、ほとんどのものは、このようなデー タ管理を持ち合わせたものになります。そのため、必然の流れとして、このよう なソフトウェアの開発を容易にするため、汎用的にデータの管理を専門に行う支 援システムが生まれました。それがデータベース管理システム(Database Management System: 以下 DBMS)と呼ばれるものです。 DBMS を用いることにより、ファイル構造設計、排他制御、トランザクション処 理、検索、と言った極めて面倒でかつ不具合の入り込みやすい部分を肩代わりし てくれます。そのため、ソフトウェア開発者は、管理すべきデータの定義やユー ザーインタフェースと言った、本来の目的の部分に集中することができます。デー タベース管理システムを使うことにより、少なくともすべてを独自で開発するの よりは、遥かに大きな信頼性を確保(もちろん開発工数の削減も)することがで きます。 \section{トランザクション} データベースの果たす機能のひとつに「データの原子性」があります。これは、データが常に完全な状態で存在するか、またはまったく存 在しないかのどちらかの状態であることを保証するものです。 たとえば、旅行の予約システムがあったとしましょう。ツアーに参加するには、「飛行機の予約」「バスの予約」「ホテルの予約」をすべ て完了しなければなりません。あるとき、「飛行機の予約」「バスの予約」は完了したものの、「ホテルの予約」だけは満室のため失敗し てしまいました。このときに、データベース上には「飛行機とバスだけが予約された不完全なツアーの予約情報」が存在していることにな ります。しかも、すでに「飛行機の予約」と「バスの予約」は完了してしまったため、解約手続きを実行しなければなりません。このよう な、不完全なデータの存在を防ぐことができる機構がトランザクション管理と呼ばれています。 トランザクション管理の考え方を、前述の旅行の予約システムに当てはめてみましょう。つまり、「飛行機の予約」「バスの予約」「ホテ ルの予約」のすべてが完了するまで、それらを確定しないようにするのです。この確定処理のことをコミットと呼びます。 もし、何らかの原因からトランザクションが正常に終了しなかった場合、データ ベースの状態をトランザクションが始まる前に戻さなければなりません。この処理 のことをロールバックと呼びます。 \section{Jasmine} 今回の実習にはJasmineを使用してもらいます。Jasmineはオブジェクト指向デー タベースであり、研究室でも頻繁に利用されています。これから行う手順をふま えれば研究室のデータベースをすべて操作できます。操作には細心の注意を払っ てください。今回つくってもらうデータベースは最も基本的なリレーショナルデー タベースです。 \subsection{使い方} ログインします。 \begin{verbatim} % ssh jasmine \end{verbatim} Jasmineで開発ができるように自分のログイン名を \begin{verbatim} /etc/group \end{verbatim} に書き込みます。さらにシェルをbashにし、環境ファイルを読み込みます。bash を使用しているというのは特にこだわりがあるわけではなく、Jasmineのマニュ アルがbashを使用しているためです。環境ファイル.profileを自分で書き換える ことができればtcsh等のシェルの使用も可能です。 \begin{verbatim} % bash % source /jasmine/jasmine2/.profile \end{verbatim} これでJasmineによる開発ができるようになりました。次回からはログイン後シェ ルをbashに変え、環境ファイルを読み込むだけで良いです。 Jasmine での操作は基本的にインタプリタ上で行います。インタプリタの起動は \begin{verbatim} % codqlie \end{verbatim} 終るときは \begin{verbatim} > end; \end{verbatim} です。 \subsection{ストア} ストアとはJasmineにおけるデータの入れ物のことです。ストアには定義情報(ク ラス、データ属性、手続き属性の定義)とユーザデータの両方が格納されます。 ストアには4種類あり、実際に触ることができるのはユーザストアとシステムス トアの2種類のみになります。 \begin{itemize} \item システムストア\\ Jasmineのシステムクラスを格納します。ユーザが利用する基本的なリテ ラル、手続きなどが入っています。 \item ユーザストア\\ ユーザが作成したものを格納するストア。 \item ワークストア\\ Jasmineのセション中の情報を一時的に格納するストア。 \item トランザクションストア 1つのトランザクション内で使われる一時的な集合を格納するストア。 \end{itemize} \subsection{クラスファミリ} クラスの集合の単位。一つのストアに対して複数のクラスファミリを作成します。 クラスファミリ名が異なれば同じストア内に同名のクラスが存在することが可能 です。 通常、複数人で開発を行う場合一人に対して一つのクラスファミリを作ります。クラ スファミリという概念のメリットはそこにあります。 \subsection{クラスファミリの作成} 今回は自分専用のクラスファミリを作成してもらいます。 \begin{verbatim} % createcf login_nameCF rinkou \end{verbatim} 例えばログイン名がkuboだったらkuboCFといった具合いになります。 これからデータベースを作成する場合は自分で作ったクラスファミリの中で作業 を行ってください。 \subsection{データベースの作成} 今回はインタプリタの基本的な使い方のみをします。サンプルファイル(/u/kubo/jasmine/setClasses.odql)があるの でこれを自分のディレクトリの適当なところにコピーしてそのディレクトリに入っ てください。そのあと \begin{verbatim} % codqlie > defaultCF login_nameCF; > execFile file_name; \end{verbatim} とするとインタプリタでファイルを読み込みます。ファイルの中身をいかにかい ておきます。 \begin{verbatim} defineClass Customer super:Composite description:"Class Customer " { instance: Integer customerNo unique: mandatory:; String customerName; String customerAddress; Void addCustomer(Integer i,String n,String a); Void deleteCustomer(Integer dn); }; defineClass Commodity super:Composite description:"Class Commodity" { instance: Integer commodityNo unique: mandatory:; String commodityName; Integer unitPrice; String commodityAddress; Void addCommodity(Integer i,String n,Integer u,String a); Void deleteCommodity(Integer dn); }; defineClass Sales super:Composite description:"Class Sales" { instance: Integer salesNo unique: mandatory:; Integer purchaserNo unique:; Integer soldCommodityNo unique:; Integer quantity; Integer amountSold; Void addSales(Integer n, Integer pn, Integer sn,Integer q, Integer am); Void deleteSales(Integer dn); }; buildClass Customer Commodity Sales; \end{verbatim} ここで作成したクラスは \begin{itemize} \item Customer \item Commodity \item Sales \end{itemize} の3つです。内容を確認するには \begin{verbatim} > Customer.print(); \end{verbatim} などとすれば良いです。 作ったクラスに値を入れてみましょう。 \begin{verbatim} > Customer c; > c=Customer.new(customerNo:=1); > c.customerName="Sample_name"; \end{verbatim} これでデータベースに登録されました。とりあえず確認のため \begin{verbatim} > c.print(); \end{verbatim} としてみましょう。登録された内容が出力されます。Jasmineでデータベース中 のオブジェクトを出力するには基本的に変数に代入してprint()メソッドを使用 します。print()メソッドはJasmineで定義されているメソッドです。 例えば \begin{verbatim} > Customer d; > d=Customer from Customer where Customer.customerNo==1; > d.print(); \end{verbatim} で見ることができます。変数はインタプリタを終了するまで有効なので途中で消 す場合は \begin{verbatim} > d.delete(); \end{verbatim} とします。もし変数がアトミックリテラルの場合は \begin{verbatim} > String s; > undefVar s; \end{verbatim} とすると消えますし、単にundefVarだけですべて消すこともできます。インタプ リタを終了する場合は \begin{verbatim} > end; \end{verbatim} です。これで一通りの使い方になります。今日は以上の作業を行ってください。 \section{参考} \subsection{ストアの作成方法} 今回の実習ではストアを作成することはないですし、これからもないかも知れま せんが作成手順について触れておきます。 \begin{verbatim} % createStore -numberOfPages 2000 -pageSize 8 store_name /jasmine/jasmine2/jasmine/data/store_name \end{verbatim} 削除するときは \begin{verbatim} % deleteStore store_name \end{verbatim} です。みなさんが使用するシステムには他に重要なデータベースもあるので、も しこれらの作業をする場合には注意してください。 \end{document}