web-dev-qa-db-ja.com

1対多の関係のルックアップテーブル

私はticketsを含むidテーブルをルックアップテーブルに関連付ける必要があります。ルックアップテーブルは、そのデータの対応物が外部ソースから制御される別のidです。

tickets
- id
- sutff

lookup
- outside_data_id
- ticket_id

関連付けが存在するかどうか(したがってlookupテーブル)と、1対多の関係があるかどうかを知る必要があります。 id自体と関連するoutside_data_id以外は、ticket_idについて他に何も知りません。

また、私はticketsテーブルを変更したくないので、これは少量のticket_idにのみ影響します。

outside_data_id = 1234

に関連することができます:

ticket_id = 321
ticket_id = 322
ticket_id = 900

以下のルックアップテーブル構造は機能するでしょうか、それとももっと良い方法がありますか?

CREATE TABLE lookup
(
   outside_data_id integer, 
   ticket_id integer
)
5
Phill Pafford

テーブルはこの目的で問題なく機能しますが、おそらくインデックスを追加する必要があります。このテーブルを使用する主な理由が、outside_ticket_idを取得して対応するticket_idを取得することである場合、次のクラスター化インデックスを追加します。

CREATE CLUSTERED INDEX [CL_Lookup_OD_ID] on [lookup](outside_data_id)
GO

プライマリルックアップが逆になる場合(ticket_idからoutside_data_idを検索しようとする場合)、クラスター化インデックスを他の列に配置します。

----ああ、すみません、これがPostgresであることに気づきました。上記の構文はSQL Serverです。 Postgresの場合、列にインデックスを作成してから、次のようにclusterコマンドを発行します。

CREATE INDEX IX_outside_data_id on lookup(outside_data_id);
CLUSTER lookup using IX_outside_data_id;

また、挿入負荷がここでどれほど重いかに応じて、インデックスの「fillfactor」を確認することもできます。しかし、それはそれ自身で調査する価値のある大きなトピックです...

5
epic_fil

作成した構造は、完全に妥当なルックアップテーブルのようです。

CREATE TABLE lookup1
(
   outside_data_id integer NOT NULL 
   , ticket_id integer NOT NULL
);

私はおそらく次のようにこのテーブルにインデックスを追加します:

CREATE CLUSTERED INDEX IX_Lookup1 
    ON Lookup1 (outside_data_id, ticket_id) 
    WITH (ALLOW_PAGE_LOCKS=ON, ALLOW_ROW_LOCKS=ON, FILLFACTOR=100);

(ぼくの CREATE INDEXサンプルはSQL Server用であり、おそらくPostgreSQLに必要な変更がいくつかあります!)

3
Max Vernon