1

一意の 32 ビット INT ID を配布するための集中型チケット サーバーを作成中です。getPrimaryKey('user') など、エンティティ/テーブルのパラメーターを受け入れるアプリケーション内で呼び出すことができる関数があります。私はこのブログ投稿を介して Flickr からアイデアを得ました。

http://code.flickr.com/blog/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/

最終的には複数の MySQL データベース間でデータをシャーディングする予定であり、概念実証としてこのコードを稼働させたいと考えています。

私の質問は、Doctrine 内でこの機能を使用するための最良の方法は何ですか? 明らかに、上記のチケット サーバーを使用して、どの Doctrine モデルにも自動インクリメント主キーが含まれていないことを指定する必要があります。

データベースに新しいレコードを挿入する前に、getPrimaryKey メソッドを使用して主キーを取得する拡張可能な Doctrine_Model メソッドはありますか? そうでない場合、アプリケーション内の別の場所からこの問題に取り組む必要がありますか?

理想的には、次のような Doctrine リレーションを使用する場合、上記の方法を使用して ID を生成したいと考えています。

$user = new User():  
$user->name = 'Bob';  
$user->Phonenumbers[]->number = '555-5555';  
$user->save();  

また、このシナリオのもう 1 つの側面は、特定のシャードからデータを選択することです。私の現在の考えは、次のように各シャードに含まれるキー範囲のマスター リストを維持することです (シャードごとの行数が少ないことは無視してください)。

シャード A ユーザー ID 1 ~ 1000
シャード B ユーザー ID 1001 ~ 2000
シャード C ユーザー ID 2001 ~ 3000

次に getShard($table_name, $primary_key) のようなものを呼び出してシャードを取得し、Doctrine 接続をその特定のシャードに切り替えることができます。特定のユーザー/エンティティの関連データは同じシャードに存在する可能性が高いため、複数のシャードにまたがる関係についてはあまり心配していません。ただし、可能性がある可能性があるため、この問題に関するガイダンスも大歓迎です。

4

0 に答える 0