Oracle SQL Developer Data ModelerのDDLからのリバース・エンジニアリング機能

## はじめに
Oracle DBaseCamp というセミナー・シリーズでSQL Developer Data Modelerについて言及していたので、中の資料で使われていたであろう(勝手な想像)DDL文をもとに、リバース・エンジニアリング機能でER図を作成してみます。

なお、[こちら](https://qiita.com/mikika/items/4c239ed3a5e0f4d8437a)でKawauchiさんがSQL DeveloperのData Modeler機能をつかって、データディクショナリからのインポート機能を紹介していますのであわせてご確認ください。
## ダウンロードとインストール
SQL Developer Data Modelerのダウンロードは [こちら](https://www.oracle.com/database/sqldeveloper/technologies/sql-data-modeler/download/) です。
Google検索からたどってもよいですが、オラクル社のサイトでは以下のようなリンクをたどると良いです。
[オラクル社のHome Page](https://oracle.com/) ⇒ 「Resources」タブ ⇒ 「Downloads」の「Developer Downloads」
![Pasted image 20240502094149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/c9f00105-7944-1e49-fc26-a25cd5eb05c2.png)
こちらの一覧から「SQL Developer Data Modeler」を選択
![Pasted image 20240502094232.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/1008bf41-2934-2e14-af7e-55ad7b207bcd.png)

現時点のバージョンは23.1.0.087 ビルド087.0806です。
インストールは Windows環境であれば「JDK included」と記載あるものをダウンロードして、適当なフォルダ内でZipファイルを解凍して実行するだけです。(手元環境はMacなので割愛)

SQL DeveloperにもData Modeler機能が付属していますが、いかにも機能を足しましたというインターフェースなので、主にER図などを扱う場合はこちらを利用した方が良いと考えています。
![20240502_SQLDeveloperDataModeler01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/350dffff-9dfe-2b42-6449-aaaa38cf2f77.png)
## DDLを用意する
参考にするDBaseCampのセミナー資料は[こちら](https://speakerdeck.com/oracle4engineer/oracle-dbasecamp-12)。
P15の第3正規化の4つの表を作成します。文字列長や数字の桁数はなんとなくの設定です。
``` SQL
create table "商品" (
"商品番号" VARCHAR2(10),
"商品名" VARCHAR2(100),
"単価" NUMBER(10),
CONSTRAINT "pk_商品" PRIMARY KEY ("商品番号") USING INDEX
);

create table "顧客" (
"顧客番号" NUMBER(10),
"顧客名" VARCHAR2(100),
CONSTRAINT "pk_顧客" PRIMARY KEY ("顧客番号") USING INDEX
);

create table "受注" (
"受注番号" NUMBER(10),
"受注日" DATE,
"顧客番号" NUMBER(10),
CONSTRAINT "pk_受注" PRIMARY KEY ("受注番号") USING INDEX
);
ALTER TABLE "受注" ADD CONSTRAINT "fk_受注_顧客" FOREIGN KEY ("顧客番号") REFERENCES "顧客"("顧客番号");

create table "明細" (
"受注番号" NUMBER(10),
"商品番号" VARCHAR2(10),
"個数" NUMBER(10),
CONSTRAINT "pk_明細" PRIMARY KEY ("受注番号","商品番号") USING INDEX
);
ALTER TABLE "明細" ADD CONSTRAINT "fk_明細_受注" FOREIGN KEY ("受注番号") REFERENCES "受注"("受注番号");
ALTER TABLE "明細" ADD CONSTRAINT "fk_明細_商品" FOREIGN KEY ("商品番号") REFERENCES "商品"("商品番号");

```
これを 20240502_DBaseCamp12.sql としてファイルに保存します。

## DDLインポート
キャプチャ画面はMacなのでWindows環境の方は適宜読み替えてください。

「ファイル」メニューから「インポート」⇒「DDLファイル」を選択。
![Pasted image 20240502102436.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/24b1810f-4598-88c9-a5a7-07347e44ab97.png)
![Pasted image 20240502102227.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/66d926eb-352e-f13c-c056-932484909d40.png)
「OK」ボタンを押すと、データベースとそのバージョンの選択肢がでてくるので今回は「Oracle Database 21c」を選択して「OK」ボタンを押します。
![Pasted image 20240502102552.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/680b99cf-78ef-3489-e0c4-17680d5512d2.png)
DDL文に誤りが無いかをチェックし、問題ないDDL文がインポートされます。(ログは不要であれば保存しなくてもよいです)
![Pasted image 20240502103537.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/3d77fbdd-a62c-f481-bddc-284aaf8ea7a3.png)
「モデルの比較」ウィンドウが表示されるので、ここではそのまま「マージ」
![Pasted image 20240502103608.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/dc8184a7-f7e6-6724-2f2d-9c668e6413bc.png)
リレーショナル・モデルができました。
![Pasted image 20240502103753.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/0809de32-1499-42a2-7b26-7249da003c61.png)
## 論理モデルへのリバース・エンジニアリング
ここから論理モデルへとリバース・エンジニアリングをおこないます。
![Pasted image 20240502103844.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/1b7e4881-0e34-9189-3c8e-75186ccb8a4d.png)
左向きの矢印2つのアイコンが「論理モデルに対するエンジニアリング」です。
![Pasted image 20240502104006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/3cb57f39-afa1-4b15-449c-d42aa9bea895.png)
ここではそのまま「エンジニア」ボタンを押します。
![Pasted image 20240502104052.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/d49a9d1a-5739-0847-f3cd-0ff32adc6c5d.png)
[セミナー資料のP17](https://speakerdeck.com/oracle4engineer/oracle-dbasecamp-12?slide=17)と同じER図ができました。
見た目を並べ替えることもできます。
![Pasted image 20240502104306.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/183aea7d-c09e-b03e-5357-c96fee77943f.png)
なお、上記はBarker記法の論理モデルですが、Bachman記法も選択できます。
「表示」メニューから「論理ダイアグラムの注釈」⇒「Bachman注釈」を選択。
![Pasted image 20240502104447.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/96b084ef-591f-1b92-ccd3-36da3588c4f1.png)
矢印などの記法が変わったことがわかります。
![Pasted image 20240502104552.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/700a707b-aa38-f276-4481-2b907c8f7a79.png)
「情報エンジニアリング注釈」はIE(Information Engineering)記法です。利用しやすいものをご利用ください。
![Pasted image 20240502104910.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/75e49a58-51b2-8c03-0b2f-5a474cbffbdc.png)
余談ですが、Barker記法はOracle SQL Developer Data Modelerの前身?である[Oracle Designer](https://en.wikipedia.org/wiki/Oracle_Designer)で取り入れられました。そのためオラクル社のツールでは現在も利用されているようです。
## 最後に
ER図を作成する機会は少なくなってきたと思いますが、一連のDDLからどのようなシステムかを俯瞰して確認することができるので、Oracle Developer Data Modelerのリバース・エンジニアリング機能を知っていると重宝することもあると思います。

以前から提供されているOracle SQL Developer Data Modelerの機能の一つをご紹介しました。