2009-05-28 6 views
1

私はこの例をできるだけ単純にしておきます。 OOPパターンのない古いVB6アプリケーションで、ドメイン駆動型のデザイン(各テーブルを表すビジネスオブジェクト)を実装しようとしています。既存のコードは、10年前のVBアプリケーション(つまり、フィールドにインテリセンスを持たないADODB.Recordsetの使用)と同じように記述されています。既存のコードは非OOPであり、私は既存のパターンに従うことを嫌う。 私の挑戦の1つは、後でDBデザインを見ている開発者にあまり混乱を招くことなく、新しい要件が登場したときにデータベースの変更をどのように処理するかです。正規化されていないワイドテーブルからクリーンブレークを作成する

我々のような負担の上に、明らかに架空の「クライアント」テーブル持って、このアプリでいるとします

(...と上と上と上)市州郵便番号電話CreditLimit CurBalance住所 のclientIdクライアント名担当者名を

新しい要件は、新しい金融分野を求めて: 利率の利用規約を

既存の2つの金融分野は、内に存在するので、奇妙なスプリットのように見えるかもしれない、独立した「Fiancials」テーブルに利率と利用規約を破るにしてもよいでしょう元のテーブル?

理想的には、古い財務フィールド(CreditLimit、CurBalance)はこの新しいテーブルに再配置されますが、アプリの多くの部分が破損する危険性があるため、フィールドを移動することは好ましくありません。私は、テーブルをより広くより広いものにする現在の慣行を止めたいだけです。

基本的には、古いコード/テーブルの設計だけを残し、新しいフィールドでクリーンブレークを行い、既存のテーブルや新しいテーブルを処理するドメインオブジェクトを作成すると考えています。つまり、Clientオブジェクトは、財務テーブル。

クリーンな休憩や既存のマックに新しいフィールドを追加することをお勧めしますか? 古いテーブルと新しいテーブルを表すための巧妙な命名体系はありますか? DBAは、既存の設計を切り離すことなく、どのようにクリーンな休憩をとっていますか?

ありがとうございました

答えて

1

ビューを使用できます。クライアントビューが財務情報を公開しなくなり、Financialsビューが作成されて情報が公開されるようにすることができます。そのため、それらが同じ基本表を共有するのはエンドユーザーに限らないためです。

次に、テーブルへのすべてのアクセスを拒否し、ストアドプロシージャとビューを介してのみアクセスし、いつでもテーブルをリファクタリングできます。

また、テーブルの名前を変更して分割し、古いテーブル名の下に表示することもできます。

重要なことは、ビジネスオブジェクトは1-1をテーブルにマップしないということです。リレーションシップのリンクテーブルがあります(たとえば、client_accountはクライアントとアカウントをリンクします)が、リレーションシップのビジネスオブジェクトはありません。代わりに、クライアントオブジェクトは通常、デザイン制約に応じてアカウントコレクションおよび/またはその逆を持ちます。

0

アクセスしているデータベースによっては、既存のデータモデルを適切に正規化された設定に置き換えて、古いテーブルの名前でビューを作成することもできます。したがって、今日のCLIENTテーブルがある場合は、それを適切なテーブルセットに分割し、既存のテーブル構造を複製するCLIENTビューを作成します。ビューが更新可能であると仮定すると(これはおそらくOracleのINSTEAD OFトリガのようなものを必要とする)、既存のコードは単にビューにアクセスし、変更を必要としません。新しいコードは、適切なデータモデルに直接アクセスできます(アプリケーションコードに影響を与えずに将来的にデータモデルを自由に展開できるビューの別のセットを介して)。既存のコードをリファクタリングする時間があれば、新しいデータモデルを指すことができます。

関連する問題