在我寻找为我的一些表的 MySQL 主键行生成数字 BigInt id 的最佳方法的过程中。我不想依赖内部时钟。我确实关心我网站的 URL 的外观,我不想将 GUID 放在 URL 中。
我在想的是使用 GUID 作为主键,但使用另一列来查询数据。该列将包括User_Id (INT) + Counter (INT)
. 计数器用于特定用户,每次插入后我将该计数器增加 1。
我希望有以下 URL 结构:
http://website.com/21474836470099
214748364700 部分是用户 ID,第二部分 '99' 是计数器。然后我可以减去该数字并创建一个查询该唯一 id(非主键)列的选择查询。我可能会在最后使用 -99,所以我不需要将整个数字写为 bigint,所以我知道如何从字符串中提取 '99' 值。
我关心可伸缩性和 URL 中的数字 ID 而不是 GUID。再说一次,我不想依赖服务器 ID 或内部时钟,只依赖数据库中的信息。此外,我不希望 URL 依赖于 primary key。
另一种选择是创建一个新列 BOX_COUNT ,它将保存在特定插入之前的盒子总数。
前任:
ID = 1
BOX_NAME = "name 1"
COUTNER = 1
ID = 5
BOX_NAME = "box 5"
COUNTER = 5
我有一列 TOTAL_USER_BOXES 在每次插入特定用户的新 BOX 时递增 1。默认情况下,每个用户框计数器从 0 开始。
所以我可以通过以下方式选择该框:
SELECT FROM boxes
WHERE user_id = 214748364700 AND counter = 5
这样 URL 不依赖于主键。这就像使用 GUID 使行独立于各种分片一样。另一种选择是一起使用 user_id + 计数器作为主键,并放弃增量 BigInt AI 主键或 GUID(也许这个似乎是最好的,而且它也是可扩展的!)
具体应用程序考虑:我的想法是对我的表进行反规范化,所以我不需要进行连接。像 NoSQL 一样使用它,因此每个框行都将包含一列,其中项目及其属性为 JSON Like。所以当我想插入一个新项目时,我将不得不反序列化然后再序列化数据。选择 + 修改 + 插入,而不仅仅是插入。
结果:
网址如:http://domain.com/93,22
或http://domain.com/92-12
特定 BOX 的短 URL 及其在我的网页中的项目,独立的 id,不依赖任何时钟同步,如 uuid_shrot() 或任何其他库和复杂的东西来制作唯一的 id。
希望听到一些建议,如果您有更好的 ID,我欢迎听到谢谢大家。