2

非正規化されたテーブルが3つあり、額面どおりに取得する必要があります(データは外部リソースから取得されます)。3つのテーブルには異なる定義がありますが、それぞれが異なる視点から同じオブジェクトを記述しています。

   object1  A  B
   object2  A
   object3     B  C
   object4        C

これらのテーブル間の唯一の共通点は、主キーです。SELECT UNION SELECTを使用してIDをまとめることはできますが、各テーブルにPKフィールドのインデックスが付けられている場合でも、クエリは比較的遅いようです。このクエリvw_object_idsを抽象化するビューを作成することもできますが、同じ速度で実行されます。ビューをマテリアライズするためにインデックスを追加できると思いましたが、SQL Server 2005では、UNIONを使用してビューにインデックスを付けることはできません。

IDのマスターインデックスを基になるデータと同期させたいのですが、基になるデータはいつでも更新または削除される可能性があります。クレイジーなトリガーのセットを使用してこれを無期限に達成することも、インデックス付けされていないビューの速度で解決することもできると思います。ただし、オプションが不足していないこと、またはこのシナリオに名前があるか、パターンを示しているかどうかを確認したかっただけです。

考え?

4

2 に答える 2

2

ID のみを含むマスター テーブルを作成します。

CREATE TABLE master (ID INT NOT NULL PRIMARY KEY)

そして、3 つのテーブルすべてを でそのマスター テーブルを参照するようにしますON DELETE CASCADE

初めてテーブルにデータを入力するには、次を発行します。

INSERT
INTO    master
SELECT  id
FROM    a
UNION
SELECT  id
FROM    b
UNION
SELECT  id
FROM    c

テーブルに定期的にデータを入力するには、3 つのテーブルのそれぞれにトリガーを作成します。

このトリガーは、新しいIDtoの挿入を試行し、違反master時に警告なしで失敗する必要があります。PRIMARY KEY

クエリするには、次を使用します。

SELECT  *
FROM    master m
LEFT OUTER JOIN
        a
ON      a.id = m.id
LEFT OUTER JOIN
        b
ON      b.id = m.id
LEFT OUTER JOIN
        c
ON      c.id = m.id

これにより、インデックスが効率的に使用されます。

削除するには、次を使用します。

DELETE
FROM    master
WHERE   id = @id

これによりON DELETE CASCADE、3 つのテーブルすべてからレコードが発生し、削除されます。

于 2009-04-01T17:58:51.893 に答える
0

外部結合を実行してから、コンポーネント テーブルの列を結合しないのはなぜですか?

于 2009-04-01T17:56:39.043 に答える