2

基本的に列挙値に VARCHAR を使用することがよくあります。それらを別のルックアップ テーブルに抽出し、整数 ID を外部キーとして使用するのが賢明な場合が多いことはわかっていますが、他のテーブルがそれを使用していない場合があり、別の JOIN が必要ないため、それらを保持することを選択しますメインテーブル。

問題は、そのような列をマークし、内部ルックアップ テーブルを使用してスペースを節約し、クエリのパフォーマンスを向上させることができる DB 機能があるかどうかです。Postgres のENUMsに似ていますが、前もって可能な値を明示的に宣言する必要はありません。

たとえば、INSERT を実行したいとします。

INSERT INTO table (date, status) VALUES ('2011-01-25', 'pending');

複数の行に同じ値が含まれて'pending'いても、実際の文字列のインスタンスを 1 つだけ保持して、内部的に整数として扱われます'pending'

一部のプログラミング言語 (LISP、Ruby) では、同様の機能をシンボルと呼び、事実上「名前付き整数」と呼んでいます。

私は主に Postgres と MySQL に興味がありますが、他のポインタも同様に高く評価されます。

4

2 に答える 2

1

Oracle テーブルの圧縮と SQL Server のページ圧縮の両方が、他のトリックに加えてこれを行います。組み込みの圧縮ルーチンを使用する利点は、それらが完全に透過的であることです。コードに余分な結合が必要なく、ディスクへのアクセスが少ないため、多くの場合、非圧縮よりも圧縮にアクセスする方が高速です。Postgres は、EXTERNAL ストレージ戦略を使用するときにTOASTの一部としてこれを行うと思いますが、より大きなフィールドに対してのみです。

于 2011-01-26T16:27:01.420 に答える
0

これがあなたの質問に答えないことはわかっていますが、関数とルックアップテーブル、または速度が重要な場合は、定数を返すだけの関数でそれを行いました。

すなわち:

INSERT INTO
  table (date, status)
VALUES
  ('2011-01-25', udf_getConst('statuscode','pending'));

また

INSERT INTO
  table (date, status)
VALUES
  ('2011-01-25', udf_Const_StatusCode_Pending());

クエリの複数の場所で定数を使用している場合は、最初にそれを変数に選択することを検討してください。

また、さまざまなステータス コードにビットごとのロジックを使用して、複数の値を 1 つの整数列に格納することもできます。

于 2011-01-26T22:46:09.873 に答える