0

まず第一に、私の書き方で申し訳ありませんが、ここでは英語が下手です。

次のシナリオを検討してください。

ビューを組み合わせたデータベースアーキテクチャを次のように作成しました。

  • エンティティ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からのすべての列が表示されます。usercity

最後に、ビューに対してクエリを実行するだけで、すべての外部参照を含む完全なエンティティが返されます。

これはうまく機能し、メンテナンス手順が非常に簡単になります。エンティティの 1 つに変更が必要な場合にすべてのビューを再コンパイルするストアド プロシージャがあります。

しかし、これには問題があり、非常に悪い状況でこれを発見しました。このアーキテクチャを使用するシステムは、すでに非常に高速かつスムーズに動作しています。たとえば、エンティティの都市を共有する 2 つのエンティティに参加する必要があるため、列の衝突、SQL Server はこれをビューで許可していません。衝突のあるクエリを問題なく実行できますが、ビューでは実行できません。

これは私の問題です。これを修正する方法を見つける必要がありますが、自分で答えを見つけることができません。

私がやった唯一のことは、列の名前を変更してハードコードされたビューを作成することです。

しかし、アップグレードのように、アーキテクチャ全体の解決策、永続的なものを求めています。

このアーキテクチャは、C# のコードで踏襲されているため、列名に依存しています。

クエリからデータを読み取るときは、列名からデータを取得する必要があるため、このコードを他のクラスで再利用して、ビューがクエリで行うのと同じことを C# コードで実行できます。

したがって、序数でデータを取得することは問題外です。

何か案は?

ありがとうございます。申し訳ありませんが、これを説明するのは非常に困難です。

4

2 に答える 2

1

さて、件名を閉じるために、SMC が提案したように、エイリアスを使用してクエリ内の列とテーブルを識別しました。

したがって、トピックの例を使用すると、クエリは次のようになります。

Select 1.user_id as 1,
       1.user_name as 2,
       1.user_login as 3,
       1.city_id as 4,
       2.city_id as 5,
       2.city_name as 6,
       2.state_name as 7
from user as 1
inner join city as 2 on 2.city_id = 1.city_id

列 4 と 5 に注目してください。今は衝突しません :)

私のアプリケーションがこのクエリを作成するClassesと、現在のクエリでエイリアスを知るために関係者も作成します。

それはうまく機能し、私の問題を解決し、ビューを使用する必要がなくなりました。

最終的に、アプリケーションは以前よりも高速になります。

それだけです:)それが誰かに役立つことを願っています。

于 2012-10-29T18:15:41.017 に答える
0

これはColumn Name、それぞれのVieworFunctionが一意でなければならないためです。列の名前を選択するときは、具体的にする必要があります。エイリアスを使用してから、列の名前を参照します。

ステートメントで 1 つの列名を複数回使用して VIEW を作成しようとしました。

* を削除し、明示的な列名を付けます

于 2012-08-20T21:01:23.657 に答える