Id Generation将用户ID和内部计数器考虑在内

时间:2012-10-20 13:26:54

标签: mysql primary-key scalability

我寻求为我的某些表格找到为我的MySQL主键行生成数字BigInt id的最佳方法。我不想依赖内部时钟。我关心我的网站的网址看起来如何,我不想把GUID放在网址中。

我的想法是使用GUID作为主键,但使用另一列来查询数据。该列将包含User_Id (INT) + Counter (INT)。该计数器适用于特定用户,每次插入后,我将该计数器增加1。

我想拥有以下网址结构:

http://website.com/21474836470099

214748364700部分是用户ID,第二部分“99”是计数器。然后我可以减去该数字并创建一个查询该唯一ID(非主键)列的选择查询。我最后可能会使用-99,所以我不需要将整个数字写成bigint,所以我知道如何从字符串中提取'99'值。

我关心可伸缩性并且URL中没有GUID的数字ID。而且,我不想依赖服务器ID或内部时钟,只是依赖于数据库中的信息。此外,我不希望网址依赖于主键

另一种选择是创建一个新列BOX_COUNT,它将保留特定插入之前的总框数。

例如:

ID = 1
BOX_NAME = "name 1"
COUTNER = 1

ID = 5
BOX_NAME = "box 5"
COUNTER = 5

我有一列TOTAL_USER_BOXES,在每个特定用户的新BOX插入时递增1。默认情况下,每个用户Box计数器从0开始。

所以我可以通过以下方式选择框:

SELECT FROM boxes 
WHERE user_id = 214748364700 AND counter = 5

这样,URL不依赖于主键。这就像使用GUID使行独立于各种分片一样。而又一个选项是将user_id +计数器作为主键一起使用,并抛弃增量BigInt AI主键或GUID(也许这些似乎是最好的,它也可以扩展!)

具体的应用考虑:我的想法是无论如何都要对我的表进行去规范化,所以我不需要进行连接。像NoSQL一样使用它,因此每个box行将包含一个列,其中的项目及其属性为JSON Like。因此,当我想插入一个新项目时,我将不得不进行解除分类,然后实现数据。选择+修改+插入而不是仅插入。

结果:

url like:http://domain.com/93,22http://domain.com/92-12

特定BOX的简短网址及其在我的网页中的ITEMS,ID是独立的,不依赖于任何时钟同步,如uuid_shrot()或任何其他库和复杂的东西来制作独特的ID。

希望能听到一些建议,如果你有更好的身份证,我很乐意听到你的意见。

0 个答案:

没有答案