私は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
)
テーブルはこの目的で問題なく機能しますが、おそらくインデックスを追加する必要があります。このテーブルを使用する主な理由が、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」を確認することもできます。しかし、それはそれ自身で調査する価値のある大きなトピックです...
作成した構造は、完全に妥当なルックアップテーブルのようです。
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に必要な変更がいくつかあります!)