クラスター環境でWebアプリケーションを開発しています。問題は、作成されるエンティティごとにIDを生成する必要があることです。私たちは、すべてが相互にストリーミングしている多数のデータベースノードがある環境にいます。私が持っていたアイデアは、オフセットのあるシーケンスでした。したがって、1つのサイトのIDは1で終わり、次のサイトは2というようになります。環境の数が限られているため、これは扱いにくいソリューションのようです。妨害されたデータベース環境にいるときに、一意に生成された主キーを保証するための「最良の」方法は何ですか?
1264 次
1 に答える
1
個人的には、オフセットのあるシーケンスが好きです。はい、特定の数の環境に制限されていますが、現実的には、通常、最初から設定して、使用可能な環境の数が実際に必要な数よりもはるかに多くなるようにすることができます。あなたが次のようなことをするなら
サイト1で
CREATE SEQUENCE sequence_name
START WITH 1
INCREMENT BY 1000;
サイト2で
CREATE SEQUENCE sequence_name
START WITH 2
INCREMENT BY 1000;
将来的には、シーケンスを作り直す前に、最大999のサイトを持つことができます。一般的にはそれで十分です。現実的に1000のサイトがあると思われる場合は、増分を10,000または100,000に設定するだけです。シーケンスが生成できる値の数を考えると、増分を数百万単位で設定しても、不足することはありません。現実的には、シーケンスの問題が発生するずっと前に、Streamsが処理するサイトが多すぎるという問題が発生します。
そのパスをたどりたくない場合、他のオプションはSYS_GUID
、グローバルに一意のIDを生成し、それを主キーに使用することです。これはシーケンスを使用するほど効率的ではなく、より多くのスペースが必要になりますが、任意の数のマシンを使用できます。
于 2012-06-06T21:13:51.657 に答える