任意の関係データベースのための典型的な解決策は、
user_invoice_numbers (user_id int primary key clustered, last_id int)
ようなテーブルとストアド・プロシージャまたは
update user_invoice_numbers set last_id = last_id + 1 where user_id = @user_id
select last_id from user_invoice_numbers where user_id = @user_id
ようなSQLクエリ各ユーザがいくつかを持っている場合は、(ユーザーのために働くかもしれません同じ会社内の異なるユーザーからのトランザクションが互いにブロックする可能性があり、この表にパフォーマンスのボトルネックが存在するため、企業では機能しません(たとえば、企業のインボイス番号が必要な場合など)。
確認する必要がある最も重要な機能要件は、であるかどうかにかかわらず、システムに隙間があるかどうかを確認することです。標準のauto_incrementを使用するとギャップが許されます。ほとんどのデータベースでは、トランザクションをロールバックすると、増分された数値はロールバックされないためです。これを念頭に置いて、次のガイドラインのいずれかを使用してパフォーマンスを向上させることができます
1)長期実行トランザクションから新しい番号を取得するために使用する手順を除外します。インボイスに挿入するプロシージャは、複雑なサーバー側ロジックを持つ長期実行トランザクションであるとします。この場合、最初に新しいIDを取得し、別のトランザクションで新しい請求書を挿入します。最後のトランザクションがロールバックされると、自動番号は減少しません。しかし、user_invoice_numbersは長い間ロックされないので、多くの同時ユーザーが請求書を同時に挿入する可能性があります。
2)従来のトランザクションデータベースを使用して各ユーザーのlast idを持つデータを保存しないでください。キーと値の単純なリストを維持する必要がある場合は、その作業を行うことができる、小さくても速いデータベースエンジンがたくさんあります。 List of Key/Value databases。恐らくmemcachedが最も人気があります。以前は、Windowsレジストリやファイルシステムを使用して単純なキー/値の格納が実装されているプロジェクトを見ていました。各ファイル名がキーであり、各ファイルの中に最後のIDがあるディレクトリがありました。そして、この大まかな解決策は、ロックが非常に迅速に発行され、リリースされ、トランザクションのスコープに関与しなかったため、SQLテーブルを使用する方が優れていました。
私の提案が最適化のために複雑すぎるように見える場合は、実際にパフォーマンスの問題にぶつかるまで、これを忘れてください。ほとんどのプロジェクトでは、追加のテーブルを持つ簡単なメソッドはかなり高速に動作します。
私は編集/削除請求書を許可していないので、全体を少し簡略化します(ギャップはありません)。しかし、私は今パフォーマンスについて心配していません。 ありがとうございます –
memcachedはデータベースエンジンではありません:http://code.google.com/p/memcached/wiki/FAQ#How_can_I_use_memcached_as_a_database? –
ギャップを生じる可能性のあるテクノロジ(この回答の自動インクリメントから表示されるような)を使用すると、シーケンスからチャンクを事前取得できるようにすることで競合を減らすことができます。最悪の場合、未使用のチャンクを失います。 – djna