2011-03-12 34 views
0

我正在构建一个使用分布式NoSQL DB的Web应用程序。但是,为了为新实体生成Ids,我使用MySQL作为Flickr's ticket server生成主键:通过从存储的Ids中提取,保存在Web应用程序的应用程序层

我只是坚持让Ids的库存保持在应用程序层的想法,以便更新的实体可以很容易地以快速方式分配ID ,而不需要从数据库中逐一提取每个数据库。相反,我可以从数据库中提取大约1000个Ids,并使用它们,直到堆栈达到剩余Ids的一定限制时,我会从DB中抽取更多Ids以再次填充堆栈。

您的想法和想法,赞赏。

回答

2

这是一个好主意,除非你需要你的ID是连续的,并且可以确保某些ID不会被使用。

例如当SAP ERP没有订购要求并且可能存在“漏洞”时,SAP ERP就可以完成它所谓的“数字范围”。每个应用程序服务器都会请求一组密钥而不是一个密钥,并将其从这个缓存中提供出来。它会在需要时重新填充缓存。这样可以节省很多往返时间并锁定数据库。

如果应用程序服务器出现故障(或系统已停止),则存在于缓存但尚未分发的任何ID都会丢失(即永远不会使用)。如果你所需要的只是一个唯一的ID,这有时会很好。如果序列中没有漏洞(对于某些国家/地区的商业凭证编号(例如发票号码)),则根本没有问题。

+0

谢谢。你完全理解我的观点..!另外为什么即使有需要的堆栈,它也可能只是一个静态计数器,因为Ids的库存是连续的。 – 2011-03-12 09:37:48

+0

那么这个ID必须是全球唯一的。所以你需要确保你使用的任何实现至少是线程安全的,并且全局一致。 “静态计数器”听起来不太好,因为它们通常不是线程安全的(取决于语言,上下文,原子性保证或缺失等)。但是有很多实现它的方法,不需要复杂的队列或堆栈类型结构。 (你可能不在线程环境中。) – Mat 2011-03-12 09:43:17

0

尽管这可行,但您可能会增加不必要的复杂性。

通用唯一ID专门用于这种情况。 A previous answer here on SO contains a pure-PHP UUIDv4 generator,如果你不喜欢使用the UUID PECL extension

的UUID的主要缺点是,他们丑陋,虽然他们可以在其他形式的仅仅是异想天开长表示。

+0

好的建议,但我试图避免UUID的原因是因为我的数据库严重非规范化和更多我想缓存包含这些Ids作为列的我的数据库行,我会喜欢比128位更小的东西,也许是i32 ID。 – 2011-03-13 07:13:33

相关问题