1

DBテーブルのステータス関連フィールドを設計するには、次のアプローチが可能です。

アプローチ01:

  • 'VARCHAR'をデータ型として使用します。
  • 直接ステータスは、NEW、IN PROGRESS、CLOSEDのように保存されます

制限:

  • テーブル内の文字列を検索するには、常により多くの時間とリソースが必要です
  • 既存のステータステキストを変更すると(例:「クローズ」から「完了」)、テーブル全体を更新する必要があります

アプローチ02:

  • ステータスルックアップテーブルを作成する
  • 依存テーブルの外部キーとしてステータステーブルを使用する

制限:

  • 外部キー関係の維持
  • アプリケーションの関連するすべてのクエリにJOINを使用する必要があります

アプローチ03:

  • ステータスフィールドにはshort(または)intを使用します
  • アプリケーションインタフェース(EJB)でENUMを使用してステータステキストを更新します

これにより、以前のアプローチの制限が解決されます

制限:

  • 整数を関連するステータスにマップする必要があります(ただし、テキストの代わりに列挙型を使用する方が適切です)

3番目のアプローチは次の点でより効率的だと思います*DBインデックスの高速化*varcharの代わりに(または)intフィールドが短いため検索が高速化*もちろんメモリフィンガープリントが少なくなります

柔軟性、メンテナンス、パフォーマンスの観点から、3番目のアプローチの落とし穴があるかどうかアドバイスしていただけますか?

前もって感謝します

4

3 に答える 3

2

私たちのアプリケーションでは、

[enum,VARCHAR(30)] にとってPROCESS TYPES

[String,VARCHAR(1)] にとってPROCESS STATUS

enumStringJavaコードでの比較を保存するので、より良い選択のように見えます。ですから、実装を[enum,NUMERIC]フィールドとして選択した場合、それはずっと続くはずです...

于 2012-08-11T13:54:58.143 に答える
2
アプローチ02:

ステータスルックアップテーブルを作成する
依存テーブルの外部キーとしてステータステーブルを使用する
制限:

外部キー関係の維持
アプリケーションの関連するすべてのクエリにJOINを使用する必要があります

ルックアップテーブルへの外部キーとして格納する値が人間が読める形式でない場合、または全文のみが適切である場合にのみ、結合を使用する必要があります。整数を使用する場合は、常に結合が必要です。ただし、一部のテーブルには人間が読めるコードを使用できます。また、char(1)のクエリは整数よりも高速である可能性があります。(3つの異なる値と1億行しかない場合、これらのどれもが速く燃えることはありません。)

    status_codeステータス
    - 
    N新規
    P進行中
    Cクローズ

「Closed」を「Completed」に変更すると、1行だけ更新する必要がありますが、それは偶然だと思います。

アプローチ03:

ステータスフィールドにはshort(または)intを使用します
アプリケーションインタフェース(EJB)でENUMを使用してステータステキストを更新します

値の整数しか持たないデータベースを維持する必要はありません。

ここに整数を格納する場合、その整数は、ビジネスに実際に関係する値を格納するテーブルへの外部キーである必要があります。また、アプリケーションENUMは、そのテーブルをクエリして生成する必要があります。

于 2012-08-12T01:57:08.137 に答える
1

私たちのプロジェクトでは、あなたの#3と非常によく似たアプローチを使用しました。Java側ではenumsを使用しました。JPAの@Enumerated(EnumType。Ordinal を使用して、データベースに永続化するときに列挙型を数値にマップしました。列挙型にステータステキストが埋め込まれていましたが(以下の例を参照)、完全に分離することもできました。

長所:

  • Javaコードは、数字や文字列だけを操作するよりもエラーが発生しにくいです。
  • データベース部分は、スペースとCPU使用率の両方で効率的です。
  • アイテムの名前は自由に変更できenumます(ただし、名前の変更や移動はできません。短所の部分を参照してください)。

短所:

  • データベース内の番号は、列挙型の序数です。enumそのため、Javaコードでアイテムを削除したり並べ替えたりすることはできません。リストの最後にのみ新しいものを追加できます。状況にもよりますが、大したことではありませんでした。列挙型アイテムの順序を移動する理由はありません。また、アイテムを削除したい場合はREMOVED_STATUS_XY、コードで使用されていないことを確認するために、名前を変更しました。

public enum Status {
    EXAMPLE_STATUS("User status message"),
    ... ;

    private Status(String label) {
        this.label = label;
    }
    private final String label;

    public final String label() {
        return label;
    }
}
于 2012-08-11T14:05:01.577 に答える