3

私はDB / Hibernateを初めて使用し、コードを見つけました:

@SequenceGenerator(name = "entSeq"、allocationSize = 5、sequenceName = "CODE_SEQ")
...
    @ID
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "entSeq")

主キーのシーケンスを設定します。

主キーの値にシーケンスが使用されたのはなぜですか? どの目標に取り組んだか:

  • パフォーマンスを向上させる
  • 制約を追加、いくつかのチェック
  • ID の整数値の可能な値の範囲を制限します。なぜそうするのですか??
  • なぜ1から数え始めるのですか?

私は構文と使用法について読んだ:

しかし、私の質問に対する答えが見つかりません。

アップデート:

私は読んで楽しんだ:

主キーの一意の ID を取得する方法が DB 理論に問題があることを示しています。つまり、自分の主キーの値を提供せずにテーブルに挿入できるということです。

    INSERT INTO サプライヤー
    (supplier_id、supplier_name)
    値
    (supplier_seq.nextval, 'クラフト食品');

しかし、この機能は、主キーの値を強制的に提供することなく、すべての DB に存在する必要があると思います...

私は正しいと思いますか?

更新 2:

START WITHを使用する理由の答え:

この句は、既存のデータベースにシーケンスを追加するときに役立ちます。古いスキームがアプリケーションで使用されていて、すでに有効な範囲からいくつかの値を消費している場合、この句を使用してそれらの消費された値をスキップできます。MINVALUE と MAXVALUE は有効な範囲を指定するために使用されますが、START WITH はその範囲内でシーケンスの使用を開始するため、以前に生成された値は再表示されません。

UPDATE3: *シーケンス* http://en.wikipedia.org/wiki/Surrogate_keyを提供

4

2 に答える 2

1

歴史的に、主な理由は 2 つあります。

  • 大きなテーブルでの ON UPDATE CASCADE によるパフォーマンスの問題を回避します。
  • 幅の広い自然キーでの結合によるパフォーマンスの問題を回避します。

Oracle は ON UPDATE CASCADE をサポートしていないため、外部キー参照で使用される値を更新することは、他のプラットフォームよりも面倒です。

これらのパフォーマンスの「問題」は、同じサイズのテーブルを考えると、20 年前よりも今日でははるかに深刻ではありません。(ハードウェアは今でははるかに高速です。) しかし、20 年前よりもはるかに大きなテーブルを扱っているようです。

この種のパフォーマンス チューニングには、望ましくない副作用がいくつかあります。

  • 通常、慎重に選択された自然キーと ON UPDATE CASCADE を使用する場合よりも多くの結合が必要になります。結合がディスク読み取りよりもコストがかかるほど多くが必要になる場合があります。
  • 結合部が 20 個または 30 個あると、結合で迷子になりやすくなります。
  • 行はすぐに理解するのが難しくなります。({1, 7, 13, 255, 438} と書かれている行は、{1, library, checkout, 255, 'A book is your friend'} と書かれている行よりも理解しにくい.)
  • 多くの場合、データベース設計者は ID 番号を主キーとして割り当てますが、他の UNIQUE 制約は設定しません。これにより、ID 番号は、行が表す実世界の識別子ではなく、行の識別子になります。それは大きな問題になる可能性があります。
于 2012-10-16T12:06:50.740 に答える
0

すべてのデータベースで自動生成されたキーに依存することはできません。他のほとんどのデータベースとは異なり、Oracleは、順次主キー値を生成するために使用できる自動インクリメントデータ型を提供していません。
ただし、シーケンスとトリガーを使用しても同じ効果を得ることができます。

于 2012-10-15T06:58:24.993 に答える