2009-04-01 6 views
2

私は3つの非正規化されたテーブルを持っています。これは、額面で取る必要があります(データは外部リソースからのものです)。 3つのテーブルは異なる定義を持っていますが、それぞれ異なる視点から同じオブジェクトを記述します。さまざまなテーブルのIDを(素早く)照合するにはどうすればよいですか?

object1 A B 
    object2 A 
    object3  B C 
    object4  C 

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

私が望むのは、IDのマスタインデックスを基になるデータと同期させ、いつでも更新または削除されるようにすることです。私は狂ったトリガーセットでこれを無期限に達成することができたと思います。インデックスのないビューの速度を落ち着かせるだけです。しかし、私はちょうど私がオプションを逃していないか、このシナリオが名前を持っているかパターンを示しているかどうかを確かめたいと思っていました。

思考?

答えて

2

のみIDが含まれているマスタテーブルを作成します。

CREATE TABLE master (ID INT NOT NULL PRIMARY KEY) 

をし、すべての3つのテーブルがON DELETE CASCADEとそのマスターテーブルを参照してください。 3つのテーブルのそれぞれにトリガーを作成し、定期的にテーブルを移入するには問題

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

、初めてのテーブルを移入する

このトリガーは、新しいIDmasterに挿入しようとし、黙って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 

これは、インデックスのefficientyを使用します。削除するには

、使用:

DELETE 
FROM master 
WHERE id = @id 

これはON DELETE CASCADEを発射し、いずれかの場合には、すべての3つのテーブルからレコードを削除します。

+0

しかし、これは実際にマスターテーブルを作成して同期する方法には答えません。 –

+0

最新の記事を参照してください。 – Quassnoi

0

外部結合を行い、コンポーネント表から列を結合するだけではどうですか?

+0

重要なのは、すべてのIDを1つの列に強制することです。外部結合では、すべてのIDが返されますが、それらは異なる列にあります。 a.id、b.id、c.id –

+0

申し訳ありませんが、その部分が明らかになると考えました。私は私の答えを更新します。 – MarkusQ

関連する問題