ここで、企業またはユーザーを取得するには、peopleテーブルに参加する必要があります。peopleテーブルを変更する場合は、すべてのクエリと、おそらく多くのコードを書き直す必要があります。
これは本当の問題ですか?DB構造に欠陥がありますか?
いいえ、このコンテキストでは構造に欠陥はありません。それに対するあなたの認識には欠陥があります。
テーブル名と列名は、データベースへのパブリックインターフェイスの一部を構成します。APIと考えてください。どんな種類のコードを書いても、APIを変更すると、コードを書き直す必要があります。データベースAPI(テーブル名と列名)を変更すると、多くのコードを書き直す必要がある場合があります。だが 。。。
バージョン管理システムからデータベースコードをチェックアウトし、「people」テーブルの列名をfirst_name、last_nameに変更するとします。他に変更を加えないと、パブリックインターフェイスが壊れているため、データベースを再構築できません。(「firstname」を選択したビューはビルドを強制終了します。「firstname」への読み取りまたは書き込みを行うストアドプロシージャはビルドを強制終了します。)
ただし、「people」テーブルの名前を変更してビューを作成することで、すぐに回復できます。あなたはこのように前進するかもしれません。
- 「人」の名前を「人」に変更します。
- 「人」という名前のビューを作成します。(
SELECT * FROM persons;
)
- ビューで、変更された2つの列のエイリアスを作成し、first_nameをfirstnameに、last_nameをlastnameにエイリアスします。
- dbmsが更新可能なビューをネイティブにサポートしていない場合は、ビューを更新可能にするために必要な手続き型コードを記述してください。
「people」という名前のベーステーブルをクエリまたは更新することを期待するコードは、代わりに「people」という名前のビューをクエリおよび更新します。他のコードを書き直す必要はありません。(ベーステーブルに対して動作しているかどうかについて不当な仮定をするコードがない限り。)
リレーショナルデータベースは、更新可能なビューを通じて論理データの独立性を実装します。