4

より速く、より良く、将来性のあるT-SQL設定で質問がありますか?

IDとステータスエントリを含むルックアップテーブルを作成する方が簡単ですか?

ID | Status
-------------
01 | Success
02 | Failure
03 | Processing

または、行ごとにステータス値を入力する方がよいでしょうか。

これはクエリの記述にどのように影響しますか?単にステータスを行に入力するのではなく、ルックアップテーブルを使用するのが良いリレーショナルデータベースの設計ですか?一方はもう一方よりも速いですか?

ルックアップテーブルが進むべき道だと思いますが、一部のデータベースではそれほど多くは見られません。

4

5 に答える 5

3

個人的には、これらのアイテムに別のステータス テーブルを使用します。次に、メイン テーブルと別のステータス テーブルの間で外部キーを使用します。クエリに関する限り、a を使用しJOINて実際のステータス名を含めるだけです。

SELECT *
FROM yourTable t
LEFT JOIN yourStatus s
    t.sid = s.id

UPDATEステータス名が変更された場合、メインテーブルに対して実行するのではなく、別のテーブルの値のみを変更することで、柔軟性が向上すると思います。

テーブル構造は次のようになります。

MainTable
id int PK,
sid int FK - to status table
col3,
col4...

Status Table
id int PK - 
name varchar(50)
IsActive bit
于 2012-08-06T13:53:23.327 に答える
2

それを行うより良い方法はありません。これは、ビジネス ロジックと保存するデータの量によって異なります。

データの重複を避けるため、通常はロックアップ テーブルを使用することをお勧めします。ステータス値のみを (繰り返しなしで) ロードする場合は、より高速になります。ステータス値のドロップダウンを作成するとします。あなたはただ作る必要があります

select * from lockup_table. 

次に、ステータスが処理中の行を選択します。

SELECT *FROM table t
LEFT JOIN lockup_table lt ON t.sid = lt.id 
WHERE lt.status LIKE 'Processing'

SGBD は pk インデックスの力を使用するため、速度も維持されます。

ただし、結合操作を避けて、データを複製した方がよい場合もあります。結合操作に時間がかかっていることに気付いた場合は、ロックアップ テーブルを削除して、その変更によってパフォーマンスが向上したかどうかを確認してください。その列のインデックスも作成できます。パフォーマンスが向上します。

結論として、ステータス列に静的な値 (成功、処理中、失敗) が必要な場合は、ロックアップ テーブルは必要ありません。ただし、動的な値を使用して無制限の範囲の値が必要な場合は、明日などにステータス値を追加できるようにする必要があります。ロックアップ テーブルを作成する必要があります。

于 2012-08-06T14:32:38.937 に答える
1

ID を持っていて、それをテーブルの外部キーとして使用する方が常に良いと思います。それが最も将来性のあるソリューションだと思います。このような状況で、特にステータスでフィルタリングしたい場合は、文字列を比較しないため、思考を高速化できます。

また、このステータス テーブルをデータベース内の他のテーブルに使用することもでき、データの交差が容易になります。

また、索引付けも簡単です。

だから私の意見では、それが進むべき道だと思います。

乾杯

于 2012-08-06T13:51:54.403 に答える
-1

個人的にはステータステーブルを使っていますが、主キーは int ではなく varchar(6) です。これにより、ステータス フィールドが自由形式ではないことを確認しながら、アドホック レポートを簡単に実行できます。

私のステータス テーブルには通常、次のフィールドがあります。

create table foo_status (
    status      varchar(6) primary key,
    active      bit,
    name        nvarchar(255),
    description ntext null
);

データテーブルは外部キーを介してそれを参照します

create table foo (
    ...
    status varchar(6) foreign key references foo_status(status)
    ...
);
create clustered index foo_fk_status_index on foo(status);
于 2012-08-06T13:53:27.867 に答える