スライド 1

テーブル設計を後から変更
現場で使える小技のご紹介
株式会社ジーワンシステム
生島 勘富(イクシマ サダヨシ)
自己紹介
生島勘富(イクシマ サダヨシ)と申しま
す。
実は長い間SQLServerを現場ではメンテ
でしか触っていません。
基本は受託開発をやっていますが、現
在、オリジナルのSaaSを企画中です。
パフォチューなどの仕事があればご紹介
ください(笑)。
はじめに(今回の概要)
データモデリングに理想はありますが、
現実は厳しい。
全く新規のシステムは非常に少なく、既
存システムに引きずられることがほとん
どです。
既存システムに影響を与えずに、理想に
近いモデリングをするにはどうしたら良
いかというお話です。
適応条件
最近多い(?)Big Dataには向きません。
「既存システムが複雑すぎてテーブル構造の
変更ができない」というような場合に使いま
す。
例えば、未だに【Filler01】などという
フィールドが存在することがありますが、そ
ういうシステムに、サブシステムなどを追加
するときに利用すると良いでしょう。
ただし、インデックスなどが倍増する可能性
もあります。
最初に新規のDBを用意
最初に新規のDBを用意します。
今後、開発するシステムは、新規DBにし
か接続しないようにします。
Oracleの場合はスキーマを分ける形でも
良いと思います。
命名法を検討し直す
テーブルの命名法(お勧め)
ID_具体名
IDは4桁ぐらいが良いでしょう。
M
T
W
S
マスタ
トランザクション
ワーク
システム
大分類
0~Z
0~Z
0~Z
0~Z
中分類
0~Z
0~Z
0~Z
0~Z
例)M000_Customers
M100_Products
M110_Products_Info
小分類
0~Z
0~Z
0~Z
0~Z
旧DBにカラムを追加
全面的にサロゲートキーを利用した形に
変更します。
まずは、全テーブルに【ID】カラムを追
加します。
外部キーに当たるカラムを追加します。
外部キーに当たるカラム名は【テーブル
ID(_識別子)】とします。
もし、*を使ってINSERTしているものが
あれば……、修正しましょう……。
旧DBにカラムを追加2
例)
http://d.hatena.ne.jp/Sikushima/2011
1220/1324338467
旧DBにトリガーを仕込む
http://d.hatena.ne.jp/Sikushima/2011
1218/1324182140
トリガーを仕込み十分にテストを行って
ください。
新ID、新外部キーにインデックスを追加
してください。
カラムの命名法を検討
カラムの命名法を修正します。
例えば、ないことを祈りますが
【Filler01】→ 【Memo01】とすべきか
も知れません。
このようなカラム名の問題を、あるべき
命名法に変換する一覧表をエクセルなど
で作成します。
新DBにビューを作ります。
カラム変換表から新DBにビューを作りま
す。
CREATE VIEW [新テーブル名] AS
SELECT
[旧カラム名] AS [新カラム名]
……
FROM [旧DB].[dbo].[旧テーブル名]
以降は新DBで新しい名前で開発が可能にな
ります。
新DBで開発するときは、FROM句ではサロ
ゲートキーで、WHERE句ではナチュラル
キーか、サロゲートキーを利用します。
正規化のやり直し
データを横に持っているなどの問題も、現実
には多い問題です。
この場合はVIEWではなく、複数に分けた実
テーブルを命名法に応じて作ります。
更に、旧システム(旧DB)でデータの更新
があった際、新システム(新DB)に自動更
新されるようにトリガーを作成します。
新システムでも更新が必要な場合は、連鎖・
ロックに十分に配慮しながらトリガーを作成
します。
※ ディレイ更新も検討
旧DBの破棄
サブシステムを追加するにあたり、この
ようにDBのデータ構造を修正しておけ
ば、次の大規模なリプレースのときに簡
単にデータ移行ができます。
SELECT *
INTO [新サーバ].[新新DB].[dbo].[新テーブル]
FROM [新テーブル]
など
(ここまで横着をする必要はありませんが……)
インデックスとトリガーは手作業で移行
する必要があります。
まとめ
未だに【Filler01】などというカラムが残ってい
るということは、20年近く前の設計思想を引き継
いでいるシステムがあるということです。
その状態で、モデリングもヘッタクレもない。
20年近く前の遺物が残っているということは、手
が付けられない状態であったのでしょうが、やり
ようによっては、既存システムを残したままで、
サロゲートキーの適応まで可能です。
現実には、これすらもコストが許されないことが
多いのですけれど、チャレンジする価値は高いで
す。
おまけ
弊社では昔から、漢字のテーブル(ビュー)
名、カラム名に直したビューを顧客用に提供
することが多いです。
更新権限を与えない場合もありますし、更新
権限を与えて、マスターメンテ画面を作らな
い場合もあります。
また、【M000_Customers】というテーブ
ル名に対し、【M000】というシノニムを設
定することもあります。
工数を削減する効果は結構ありますので、規
約が許せばご利用ください。
ご清聴ありがとうございまし
た。
株式会社ジーワンシステム
生島 勘富
@sikushima
[email protected]