Doctrine ORM:使用票证服务器生成主 ID 的最佳方法?
我正在创建一个集中式票证服务器,用于分发唯一的 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 模型都不包含自动递增主键。
我是否可以扩展 Doctrine_Model 方法,在将新记录插入数据库之前使用 getPrimaryKey 方法检索主键?如果不是,我应该从应用程序中的另一个地方解决这个问题吗?
理想情况下,我希望在使用 Doctrine 关系时使用上述方法生成 ids,例如:
$user = new User():
$user->name = 'Bob';
$user->Phonenumbers[]->number = '555-5555';
$user->save();
此外,此场景的另一面是从特定分片中选择数据。我当前的想法是维护每个分片上包含的键范围的主列表,如下所示(忽略每个分片的少量行):
Shard A user_id 1-1000
分片 B user_id 1001-2000
Shard C user_id 2001-3000
然后,我可以调用 getShard($table_name, $primary_key) 之类的方法来获取分片,并可能将我的 Doctrine 连接切换到该特定分片。特定用户/实体的相关数据很可能驻留在同一个分片上,因此我不太担心跨越多个分片的关系。不过,这可能是一种可能性,因此我们也将不胜感激有关此问题的任何指导。
I am in the process of creating a centralized ticket server for handing out unique 32bit INT ids. I have a function that can be called within my application that accepts a parameter for the entity/ table, e.g. getPrimaryKey('user'). I got the idea from Flickr via this blog post:
http://code.flickr.com/blog/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/
We will eventually be sharding our data amongst multiple MySQL databases and I would like to get this code up and running as a proof of concept.
My question is what is the best method for using this functionality within Doctrine? Obviously, using the above ticket server, I will need to specify that none of my Doctrine models contain an auto- incrementing primary key.
Is there a Doctrine_Model method I can extend that will retrieve the primary key using my getPrimaryKey method prior to inserting a new record into the database? If not, should I be approaching this problem from another place within my application?
Ideally, I would like the ids to be generated using the above method when using Doctrine relations such as:
$user = new User():
$user->name = 'Bob';
$user->Phonenumbers[]->number = '555-5555';
$user->save();
Also, the other side of this scenario is in selecting data from a particular shard. My current thought is to maintain a master list of key ranges contained on each shard like this (ignore the small number of rows per shard):
Shard A user_id 1-1000
Shard B user_id 1001-2000
Shard C user_id 2001-3000
I can then call something like getShard($table_name, $primary_key) to get the shard and possibly switch my Doctrine connection to that particular shard. Related data for a particular user/entity will most likely reside on the same shard so I am not too worried relations spanning multiple shards. Though, it may be a possibility, so any guidance on this issue would be greatly appreciated as well.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论