1

Documentsテーブルに複合キーを作成したいと思います(それはアイデアですが、他の提案も受け付けています)。これは、年(2010、...)とIDの2つの列で構成され、自動インクリメントされますが、毎年自動的に再起動する必要があります。

したがって、これらの2010-1、2010-2、...、2011-1、2011-2、...のようなキー、およびできればこれらのキーは、表示、印刷、および検索にも使用する必要があります。

自動インクリメントが機能するとは思いませんが、毎年リセットされるため、自分でインクリメントする必要があると思いますね。

または、varchar列を作成して各キーを自分で作成し、その列に一意の列を配置する必要がありますか?

だから、私のオプションは何ですか?

また、選択したデザインで発生する可能性のある将来のデザインの問題と、クエリのしやすさも考慮に入れてください。

アップデート:

私は実際に、アプリケーションにキーを作成させ、挿入時にそれを提供させることを検討し始めています。ただし、最後に発行されたIDをDBで調べる必要があるため、大量の使用で問題が発生する可能性があります。

4

4 に答える 4

3

ビジネスをデータストレージ構造で分離することをお勧めします。なんで?明日、誰かがビジネスロジックを変更することを決定するからです。

  • 整数以外のドキュメント順序を使用する(1-AA、1-AB、1-AC ...)
  • 年と月を含めて、月次レポートを作成します
  • その他の変更...

そして、あなたは何をすべきですか?

だから、私の解決策は:

  • 主キー(たとえば、intまたは任意のデータ型)を使用して、データベース内の他のテーブルとの関係を作成します
  • ビジネスキー1.2.3を使用してください...必要に応じて(おそらくいくつかの識別子ジェネレータ)
  • datetimeフィールドを使用して、ドキュメントを追加する日付(動的に計算できる年)を保存します。
于 2010-08-04T22:24:54.023 に答える
1

自動インクリメントキーを作成するのが面倒な場合は、毎年それをリセットするという考えを捨てて、代わりにIDENTITYINT列を使用します。

1年以内にドキュメントのシーケンス番号を取得したい場合は、それを行うために使用できるSQL関数があります。

ROW_NUMBER()OVER(PARTITION BY ... ORDER BY ...)

于 2010-08-04T22:06:40.327 に答える
1

自動インクリメントが機能するとは思いませんが、毎年リセットされるため、自分でインクリメントする必要があると思いますね。

うん。

リセット値を生成するために列を追加することをお勧めします。IDENTITY列が最適です。DATETIMEはレコード作成時間を保持できますが、互いに3.33ミリ秒(0.00333秒)以内のトランザクションのタイムスタンプは同じになります。

idどちらの方法でも、次を使用して値を生成できます。

SELECT (SELECT COUNT(*)
          FROM DOCUMENTS t
         WHERE t.year = d.year
           AND t.col <= d.col) AS id,
        d.year
   FROM DOCUMENTS d

または、SQL Server 2005以降を使用している場合は、次を使用できます。

 SELECT ROW_NUMBER() OVER (PARTITION BY d.year ORDER BY d.col) AS id,
        d.year
   FROM DOCUMENTS d
于 2010-08-04T21:57:19.893 に答える
1

実際の自動インクリメントIDを追加してみませんか?複合キーは、実質的に役に立たないところまですぐに成長する可能性があります。特に、テーブルに参加する必要がある場合は、パフォーマンス上の理由からです。次に、ドキュメントXYZが2010年に保存された最初のドキュメントであることもログに記録したい場合は、列YearOrder(またはその他の)列を保持できますが、主キーはきれいに保たれます。

于 2010-08-04T21:58:10.020 に答える