テーブル設計の3つのstep
1.概念設計
2.論理設計
3.物理設計
1.概念設計
エンティティを見つける。
エンティティとは物や出来事に対応する概念。
帳票からエンティティを抜き出す。
例:注文、顧客、商品
帳票に存在する項目がどのエンティティの属性になるか考える。
顧客エンティティ
→顧客番号、顧客名、住所
商品エンティティ
→商品番号、商品名、単価
ER図を書く。
繋がるエンティティに線を引く。
2.論理設計
テーブルに主キー列を設ける。
・主キーはテーブルの列で1番上に記載。
・主キーには下線をつける。
結合するカラムの外部キーを設定する。
1対多の関連について1の方の主キーを他の方のFKにする。
関連の多重度を明らかにする。
1対1か1対多か。
多対多の場合
交差テーブルを作成する。
多対多が存在しないようにする。
1対1の場合
データベースの観点からはテーブル数は少ない方が良い。
1対1の場合どちらかが補助的な役割になっているので統合する。
重複して存在する列を削除する
履歴テーブルなどは問題あることも。
他の列から計算できる列を取り除く
最終確認 正規形になっているか
1.主キーの一部の値が決まると値が決定する列がないこと。
2.段階的に値が決定しまう列がないこと。
列に設定するデータ項目の特徴を整理
3.物理設計
Oracleのストレージ領域割り当てについて。
あらかじめ表領域を割り当てる。
CREATE TABLESPACE <表領域名> DATAFILE '<データファイルのパス>' SIZE <サイズ>[REUSE][AUTOEXTENDON],....
パラメーター | 内容 |
---|---|
データファイルのパス | データファイルのパス。一般的にはdbf |
SIZE<サイズ> | データファイルのサイズを指定。 |
REUSE | 指定したデータファイルのパスに、既にデータファイルが存在していた場合は再利用する。 |
AUTOEXTEND ON | 自動拡張ON |
例)
sql>CREATE TABLESPACE tbs01
2 DATAFILE 'c:/oracle/oradata/tbs01_1.dbf' SIZE 100M AUTOEXTENDED ON
3 ,'c:/oracle¥oradata¥tbs01_2.dbf' SIZE 100M AUTOEXTEND ON;
テーブル作成時に格納先表領域を指定
CREATE TABLE tbl01(id NUMBER,col1 VARCHAR2(100)) TABLESPACE tbs01;
それぞれのユーザーにデフォルトで表領域が決まっているが、ユーザーのデフォルト外の表領域を選択する場合は表領域の指定が必要。
表領域削除の場合は、中にあるデータファイルも同時に消さないとエラーが発生する。
DROP TABLESPACE <表領域> [INCLUDING CONTENTS [AND DATAFILES]];
INCLUDING CONTENTS:格納したオブジェクトとともに。
AND DATAFILES:DATAFILEとともに。
制約を決める
値が決まっているもの→チェック制約
(選択肢)
NOT NULL制約
主キー制約
外部キー制約
一意性制約
インデックスをつける列をきめる
Oracle:主キー、一意キーには自動でインデックスがついているので必要なし。
テーブルインデックスのサイズを見積もる
Oracle:テーブルのコストを見積もるプロシージャとしてDBMS_SPACE.CREATE_TABLE_COST
インデックス:DBMS_SPACE.CREATE_INDEX_COST
が存在する。
オプジェクト(テーブル、インデックス)を格納する表領域を作成
CREATE TABLESPACE order_tbs DATAFILE 'C¥oracle¥order_tbs01.dbf' SIZE 100M AUTOEXTEND ON;
オブジェクトの所有ユーザーを作成
CREATE USER order_app IDENTIFIED BY password QUOTA UNLIMITED ON order_tbs;
order_appユーザーを作成
GRANT CREATE SESSION TO order_app;
order_appユーザーにcerate session権限を付与