\documentclass[a4j]{jarticle} \pagestyle{plain} \usepackage{graphicx} \begin{document} \begin{center} {\Large データ定義} \end{center} \begin{flushright} \today\\ 峯 肇史 \end{flushright} \section{データモデル} DBMSは,データベースを各種アプリケーションから統一的に利用可能とするため, 対象データをそれに対する操作を規定した共通の枠組みを提供する.この枠組み のことを{\bf データモデル}と呼ぶ.データモデルを用いることで,データの物 理的な格納形態やデータ検索手順の詳細に関与することなく,論理的なレベルで のデータ記述と操作を行うことが可能になる.代表的なデータモデルの1つにリ レーショナルデータモデルがある.リレーショナルデータモデルでは,データベー スを「表」の集まりとしてとらえる見方を提供する. \section{データ定義} DBMSは,データモデルに基づくデータ記述ならびにデータ操作のためのデータベー ス言語(database language) を提供する.データベース言語の内,主にデータ記 述を行うための言語をデータ定義言語(data definition language, DDL) と呼び, データ操作を行うための言語をデータ操作言語(data mamipulation language, DML)と呼ぶ.データ定義とはデータ定義言語を用いて,データベースに作成するデータをDBMSに定義することである. \section{Jasmineでのデータ定義} 今回は,以下のような3つの情報をデータベースに格納するとしてJasimineを用 いたデータベース定義の手順を説明する.\\ \begin{table}[h] 得意先(Customer)\\ \begin{tabular}{@{\vrule width 1pt~}c|c|c@{\ \vrule width 1pt}} \noalign{\hrule\hrule\hrule} 得意先コード(customerNo)&得意先名(customerName)&住所(customerAddress) \\ \hline 1 & 峯商店& 福岡市東区箱崎 \\ \hline 2 & 森田菓子店& 福岡市東区筥松 \\ \hline $\vdots$ & $\vdots$ & $\vdots$ \\ \noalign{\hrule\hrule\hrule} \end{tabular}\\ 商品(Commodity)\\ \begin{tabular}{@{\vrule width 1pt~}c|c|c@{\ \vrule width 1pt}} \noalign{\hrule\hrule\hrule} 商品コード(commodityNo)&商品名(commodityName)&単価[円](unitPrice) \\ \hline 1 & チョコレート& 200\\ \hline 2 & ガム& 100\\ \hline $\vdots$ & $\vdots$ & $\vdots$ \\ \noalign{\hrule\hrule\hrule} \end{tabular} \end{table} \newpage \begin{table}[t] 売り上げ(Sales)\\ \begin{tabular}{@{\vrule width 1pt~}c|c|c|c|c@{\ \vrule width 1pt}} \noalign{\hrule\hrule\hrule} 売り上げ番号&商品コード&得意先コード&数量&金額[円]\\ (salesNo)&(soldCommodityNo)&(purchaserNo)&(quantity)&(amountSold)\\ \hline 1 & 1 & 2 & 100 & 20,000\\ \hline 2 & 2 & 1 & 50 & 5,000\\ \hline $\vdots$ & $\vdots$ & $\vdots$ & $\vdots$ & $\vdots$\\ \noalign{\hrule\hrule\hrule} \end{tabular} \end{table} 上の例はすべてテーブルで表してあるので,リレーショナルデータベースを用い る場合は,このテーブルをそのまま定義すればよい.(リレーショナルデータベー スのデータベース言語の国際的な標準言語はSQLである.) しかし今回使用するDBMS Jasmine はオブジェクトデータベースであるので,そ れぞれのテーブルを1つのクラス,テーブルの各属性をそれぞれ対応するクラ スの属性としてデータベースに定義する.つまり以下のようなクラスを定義する. \begin{itemize} \item Customer クラス\\ 属性 \begin{itemize} \vspace{-1em} \item customerNo (整数) \item customerName (文字列) \item customerAddress (文字列) \end{itemize} \item Commodity クラス\\ 属性 \begin{itemize} \vspace{-1em} \item commodityNo (整数) \item commodityName (文字列) \item unitPrice (整数) \end{itemize} \item Sales クラス\\ 属性 \begin{itemize} \vspace{-1em} \item salesNo (整数) \item soldCommodityNo (整数) \item purchaserNo (整数) \item quantity (整数) \item amountSold (整数) \end{itemize} \end{itemize} Jasmineでは,ODQLというデータベース言語を用いてデータの定義,操作を行う ことになっている.そこで,ODQLを用いてこれらのクラスをデータベースに定義 する.\\ ODQLにおけるクラスの生成は,次の2ステップからなる. \begin{itemize} \item defineClass コマンドを使って ODQL インタプリタでクラス定義を行 う. \item buildClass コマンドを使ってクラスの構築を行う. \end{itemize} クラスの構築を行うときに,すべての定義が互いに矛盾しないかどうかがチェッ クされる.構築が終了すると,それらのクラスに対してインスタンスの生成が行える ようになる. \subsection{クラス定義} ODQLを用いたCustomerクラスのクラス定義は以下のようになる.(左端の数字は 行番号で実際のコードには存在しない.) \begin{verbatim} 1. defaultCF accountCF; /*自分が使うクラスファミリ名 アカウント名CF*/ 2. defineClass Customer /*クラス名*/ 3. super:Composite /*上位クラス*/ 4. description:"Class Customer " /*クラスの説明*/ 5. { 6. instance: /*これより下の属性はインスタンス属性*/ 7. Integer customerNo unique: mandatory:; 8. String customerName; 9. String customerAddress; 10. }; \end{verbatim} 各行の説明は \begin{enumerate} \item デフォルトのクラスファミリ名をaccountCFにする. \item Customerという名前のクラスの定義を開始する. \item このクラスの上位クラスを指定.(Jasmineでは,ユーザ定義クラスは必 ず Compositeクラスから派生することになっている.) \item このクラスの説明を記述. \item これより属性の定義. \item instace:と記述することによりこれより下に記述する属性は,イ ンスタンス属性であることを示す.(クラス属性の場合は,class:の後に 記述すればよい) \item 整数型の customerNoという名前のインスタンス属性の定義. \item 文字列型の customerNameという名前のインスタンス属性の定義. \item 文字列型の customerAddressという名前のインスタンス属性の定義. \item クラス定義の終了. \end{enumerate} 6行目の unique, mandatoryというのは,制約条件のための記述である.unique は,このクラスのインスタンスすべての中で重複した値を許さないことの記述であ り.mandatoryは,この値に空の値(NIL)を許さないこと記述している.(詳しい 説明は,制約条件の回で説明されるであろう) このコードをインタプリタで1行ずつ入力すれば,クラス定義が出来るが,もし間 違えるとまたもう1度初めから入力しなければならないので,普通はこのコード をファイルに記述しておきそのファイルをインタプリタのコマンドexecFileを用 いて読み込む.例えば上のODQL文を sample.odqlというファイルに保存したとす ると以下のようにしてODQL文を実行できる. \begin{itemize} \item[$>$] execFile sample.odql; \end{itemize} ここで1つ注意点であるが,Jasmineではクラスはクラスファミリ名の修飾が必要 となっている.そこで defineClassの記述の前に以下の行を付け加えることを忘 れないでもらいたい.\\ defaultCF mineCF;\\ (mineCFのところは自分が使うクラスファミリ名.アカウント名CF)\\ このコマンドにより,デフォルトのクラスファミリの名前がmineCFとなるので, mineCFとsystemCF以外のクラスを使うときだけクラスファミリ名の修飾をすれば よい. Commodityクラスと SalesクラスのODQLでの定義は以下のようになる. \begin{verbatim} /* Commodity クラス */ defineClass Commodity super:Composite description:"Class Commodity" { instance: Integer commodityNo unique: mandatory:; String commodityName; Integer unitPrice; }; /* Salesクラス */ defineClass Sales super:Composite description:"Class Sales" { instance: Integer salesNo unique: mandatory:; Integer soldCommodityNo; Integer purchaserNo; Integer quantity; Integer amountSold; }; \end{verbatim} \subsection{クラスの構築} 以上でクラス定義が出来るので,後はクラスを構築すればデータ定義は終了であ る.クラスの構築は,ODQLコマンドbuildClassを用いる.以下にクラスファミリ mineCFにCustomerクラス,Commodityクラス,Salesクラスを構築する方法を示す. \begin{itemize} \item[$>$] buildClass mineCF::Customer; \item[$>$] buildClass mineCF::Commodity; \item[$>$] buildClass mineCF::Sales; \end{itemize} ここでは,クラスファミリの修飾を行っているが,以前述べたように defaultCF コマンドを用いてデフォルトのクラスファミリを指定しておけば,クラスファミ リの修飾はいらない. \subsection{クラス情報の表示} 以上でクラスが構築できたわけであるが,クラスが構築できているか確かめるた めには,以下のようにして構築されているクラスの情報を表示することができる. \begin{itemize} \item[$>$] className.print(); \end{itemize} \subsection{クラスの削除} 1度構築したクラスを削除するには以下のようにする. \begin{itemize} \item[$>$] className.delete(); \end{itemize} この操作により,クラス名がclassNameであるクラスが削除される. \subsection{エラーの対処法} クラスを定義しているとエラーがでる場合がある.エラーがでるとエラーの場所 の近くを表示するので,その周辺からコードのミスなどを探すことができる.エ ラーは日本語で出してくれるので分かりやすいと思う. \section{実習} 今日は,自分のクラスファミリに Customerクラス,Commodyクラス,Salesクラ スを定義,構築して下さい.今日この文章にかいたODQL文を実行すればクラスの 定義,構築はできます. \end{document} DBMSで管理可能なデータベースを作成するには,DMBSシステムがサポートするデー タモデルでデータを記述する必要がある.つまり,データ定義言語で記述する必要 がある.しかし,実世界の複雑な情報から直接これらのデータをデータモデルで 記述することは一般的に困難である.また,一旦データベース化が行われた後で もデータベース中のデータ構造や意味を理解する上では,DBMSが直接的にサポー トするデータモデルの制約にとらわれないデータの自然な表現を持っていること が有用である.この様な理由からデータベース設計は,少なくとも概念設計と論 理設計という二つの段階を経て行われる.