SQLServerにはunsignedintがないので、-2,147,483,648のIDシードは大きなテーブルには意味がありませんか?



There Is No Unsigned Int Sql Server Doesnt An Identity Seed 2



解決:

SQL Serverに関する限り、-2,147,483,648から開始してもまったく問題はありません。 2,147,483,647から始まり、IDENTITY(2147483647、-1)も完全に有効です。

そうすることを私に警戒させるもの:



  1. そのような立場で負の値を見ることを期待しない人々を混乱させるかもしれません。それは簡単にバグのように見える可能性があるほど珍しいです。他に何もなければ、あなたはそれを説明することにうんざりするかもしれません。
  2. 何らかの理由でIDを他のサービスに渡すと、入力の検証に失敗する可能性があります。ネガティブが表示されることを期待せずに、そのコードに対して実行してください(外部システムは、このように内部IDを気にする必要はありませんが、発生するはずの多くのことがあります。 'NS!)。さらに、アプリケーションの他のレイヤーのコードでは、unsigned int32が使用されている可能性があり、「down from int.max」オプションは、0を下回るまで問題が発生しないため、さらに危険になります。
  3. 人々は時々負のマジックナンバーを特別な意味を持つために使用します、そしてこれはバグを説明するのを難しくすることにつながる衝突を引き起こすかもしれません。例えばショートニングWHERE(x.ay.a OR x.a IS NULL AND y.a IS NOT NULL OR x.a IS NOT NULL AND y.a IS NULL)toWHERE ISNULL(x.a、-1)ISNULL(x.a、-2)は、私が何度も見たものです。それは決してないので、あなたのPKにはありそうにありませんNULLですが、他のテーブルのFK値を比較するときに発生する可能性があります。私は誰かが使用するのを見たことがありますsomevalue> -1の代わりにsomevalue IS NOT NULL(どうやら、それがより効率的な状況がありますが、彼は状況が何であるかを私の満足に説明しませんでした!)。 DBの外部のコードにもそれと他の奇妙なシェナニガンがあるかもしれません。
  4. 最も重要なこと: 規模 、特に予想外の規模。早期に消滅しないソフトウェアとデータは、多くの場合、作成者のビジョンよりも長生きし、それに応じて時間の経過とともに成長します。ストレージまたはRAM(おそらく組み込みシステム内)によって非常に制約されていない限り、予想よりも少なくとも1桁高い計画を立ててください。
    データの存続期間中に約400,000,000に達する可能性が高いと予想される場合、2または4 000,000,000の差が考慮されるずっと前に、すでに大きなキーを使用するので、負の値を使用して2倍にします。大きな違いはありません。
    4年後にPKのようなコアに変更を加えたくはありませんが、8年後にはさらに変更を加えたくありません。どちらの場合も、デザインが長続きする場合は、詳細を忘れてしまい、他の多くのビットとボブがキーに依存し始めたため、変更を加える必要があり、その1つのテーブルでさえも大規模な作業になります。その数の行が含まれているため、(ほとんどのデータがしばらくして削除されない限り)変更すると、FKでそれを参照するすべての行も処理できるようになります。

いいえ、あなたは何も見逃していません。 IDは、コンピューターが割り当てて処理するための無意味な内部のみの代理であることが意図されており、コンピューターは、正の数を使用するか負の数を使用するかを気にしません。

しかし..それは決してそれほど単純ではありません。これらのことを読み、理解し、和解させようとする人間が常にどこかにいるでしょう。大規模な正の数よりも大規模な負の数について考えるのは難しいと思います。あなたのシステムを機能させようとしている人々を難しくしないでください。最終的に、これらはレポート、外部参照、画面にリークします。アカウントにアクセスするには、電話のキーパッドを使用して顧客IDを入力する必要があることを顧客にマイナス20億と伝えてみてください。



将来的にIDがオーバーフローする可能性があると思われる場合は、すぐに大きなデータ型を使用してください。 Y2K問題を引き起こした考慮事項は過去のものです。ディスクは安いです。クエリごとに使用される追加のメモリは、アプリケーションが50年の寿命で設計されていることを知っているので、安心とバランスを取ることができます。最後の整数が割り当てられた4年後(または8年後)に対して追加の監視を実装する必要はありません。

オーバーフローしたシステムが1つあり、IDが21億ずつ減少し、int.Minで効果的に再起動したことを私は知っています。別の人が負のIDを使用しているのを見ましたが、ログがそれらをvarchar(10)にキャストしてマイナス記号を切り捨てたため、失敗しました。念のため、IDがnumeric(18,0)として定義されている別の場所を知っています。そして、計画がないまま別のオーバーフローが発生し、しばらくの間システムがダウンするのを見てきました。 int.maxに到達すると、定義上、40億行を処理する必要があり、それは楽しい週末にはなりません。