バックグラウンド
私は、SQL Server 2005 によってホストされる単一のデータベースと多数のクライアント アプリケーションを備えた従来のスモール ビジネス自動化システム (在庫、販売、調達など) に取り組んでいます。メイン クライアント (すべてのユーザーが使用) は MS Access 2003 アプリケーション (ADP) で、その他のクライアントには、Excel アドインやコマンド ライン ユーティリティなどのさまざまな VB/VBA アプリケーションが含まれます。
60 ほどのテーブル (ほとんどが 3NF) に加えて、データベースには約 200 のビュー、約 170 の UDF (ほとんどがスカラーおよびテーブル値のインラインのもの)、および約 50 のストアド プロシージャが含まれています。ご想像のとおり、いわゆる "ビジネス ロジック" の一部は、この大量の T-SQL コードにカプセル化されています (したがって、すべてのクライアントで共有されます)。
全体として、システムのコード (T-SQL コードを含む) はあまり整理されておらず、いわばリファクタリングに非常に抵抗力があります。特に、ほとんどのテーブルのスキーマは、小規模 (列の名前変更など) から大規模 (正規化など) まで、あらゆる種類のリファクタリングを必要としています。
FWIW、私はかなり長い間まともなアプリケーション開発経験 (C/C++、Java、VB など) を持っていますが、DBA ではありません。したがって、質問がばかげているように見える場合は、なぜそうなのかがわかります。:-)
質問
このすべての混乱をリファクタリングすることを考えているときに (もちろん平和的な方法で)、次のアイデアを思いつきました。
テーブルごとに、(a) テーブルに含まれるすべての列を含む「ラッパー」ビューを作成します。(b) 場合によっては、テーブルの「実際の」列に基づく追加の計算列があります。
このような追加の計算列の典型的な (単純ではありますが) 例は、製品の通常価格と割引から派生した製品のセール価格です。
「ラッパー」ビューのみがテーブルを直接参照するように、すべてのコード (T-SQL と VB/VBA クライアント コードの両方) を再編成します。
したがって、たとえば、アプリケーションまたはストアド プロシージャがテーブルからレコードを挿入/更新/削除する必要がある場合でも、テーブルに対して直接ではなく、対応する「テーブル ラッパー」ビューに対してそれを行います。
したがって、基本的にこれは、ビューによってすべてのテーブルをシステムの残りの部分から分離することです。
このアプローチは、特に保守性の観点から、多くの利点を提供するようです。例えば:
テーブル列の名前を変更する場合、影響を受けるすべてのクライアント コードを一度に書き直さなくても実行できます。
派生属性を実装する方が簡単です (計算列を使用するよりも簡単です)。
列名のエイリアスを効果的に使用できます。
明らかに、これらすべての利点には何らかの代償が必要ですが、そこにすべてのキャッチが潜んでいるのを見ているかどうかはわかりません.
誰かが実際にこのアプローチを試しましたか? 主な落とし穴は何ですか?
明らかな欠点の 1 つは、「ラッパー」ビューを対応するテーブルと同期して維持するコストです (テーブル内の新しい列もビューに追加する必要があります。テーブルから削除された列はビューからも削除する必要があります。など)。 .)。しかし、この価格は、コードベース全体をより回復力のあるものにするためには小さく、公正であるように思われます.
他の強力な欠点を知っている人はいますか?
たとえば、テーブルの代わりにこれらすべての「ラッパー」ビューを使用すると、パフォーマンスに何らかの悪影響が及ぶ可能性が非常に高くなりますが、この影響は心配するほど大きくなるでしょうか? また、ADODB を使用している場合、いくつかの結合されたテーブルに基づいている場合でも、更新できないレコードセットを取得するのは非常に簡単です。では、「ラッパー」ビューは事態を大幅に悪化させるのでしょうか? などなど…。
コメント(特に共有された実際の経験)は大歓迎です。
ありがとうございました!
PS私は、「ラッパー」ビューのアイデアを議論する次の古い記事を踏んだ:
この記事では、上記のアプローチを避けるようにアドバイスしています。しかし...この記事では、この考えに反対する正当な理由は見当たりません。まったく逆に、ビューを作成する正当な理由のリストでは、ほぼすべての項目がまさに、すべてのテーブルに対して「ラッパー」ビューを作成することが非常に魅力的である理由です (特にレガシー システムでは、リファクタリング プロセスの一部として) )。
この記事は非常に古い (1999 年) ため、その理由が何であれ、当時は適切であったとしても、現在では適切ではない可能性があります (逆もまた同様です)。最新バージョンの SQL Server と MS Access を使用して、最近このアイデアを検討したり、試したりした人から話を聞くのは非常に興味深いことです...