まず第一に、私の書き方で申し訳ありませんが、ここでは英語が下手です。
次のシナリオを検討してください。
ビューを組み合わせたデータベースアーキテクチャを次のように作成しました。
- エンティティ
City
には列 {city_id, city_name, state_name, ...
}があります - エンティティ
User
には列 {user_id, user_name, user_login, city_id, ...
}があります
各エンティティにはビューがあり、city
ビューには他のエンティティへの FK がないため、単純な選択です。
User
エンティティにはエンティティへの FK が 1 つcity
あるため、ビュー内のエンティティと結合しcity
ます。
次の例のように:
create view vw_user as
select user.user_id,
user.user_name,
user.user_login,
vw_city.*
from user (nolock)
inner join vw_city (nolock) on vw_city.city_id = user.city_id
go
したがって、ユーザーへの FK を持つ user_access のようなエンティティがある場合、 のビューにuser_access
は への内部結合があり、およびエンティティvw_user
からのすべての列が表示されます。user
city
最後に、ビューに対してクエリを実行するだけで、すべての外部参照を含む完全なエンティティが返されます。
これはうまく機能し、メンテナンス手順が非常に簡単になります。エンティティの 1 つに変更が必要な場合にすべてのビューを再コンパイルするストアド プロシージャがあります。
しかし、これには問題があり、非常に悪い状況でこれを発見しました。このアーキテクチャを使用するシステムは、すでに非常に高速かつスムーズに動作しています。たとえば、エンティティの都市を共有する 2 つのエンティティに参加する必要があるため、列の衝突、SQL Server はこれをビューで許可していません。衝突のあるクエリを問題なく実行できますが、ビューでは実行できません。
これは私の問題です。これを修正する方法を見つける必要がありますが、自分で答えを見つけることができません。
私がやった唯一のことは、列の名前を変更してハードコードされたビューを作成することです。
しかし、アップグレードのように、アーキテクチャ全体の解決策、永続的なものを求めています。
このアーキテクチャは、C# のコードで踏襲されているため、列名に依存しています。
クエリからデータを読み取るときは、列名からデータを取得する必要があるため、このコードを他のクラスで再利用して、ビューがクエリで行うのと同じことを C# コードで実行できます。
したがって、序数でデータを取得することは問題外です。
何か案は?
ありがとうございます。申し訳ありませんが、これを説明するのは非常に困難です。