如何用该表唯一的另一个整数替换Django的主键

如何用该表唯一的另一个整数替换Django的主键,第1张

如何用该表唯一的另一个整数替换Django的主键

The Idea

我会向你推荐Instragam所使用的相同方法。他们的要求似乎紧随你的要求。

生成的ID应该可以按时间排序(例如,可以在不获取有关照片的更多信息的情况下对照片ID列表进行排序)ID理想情况下应为64位(以用于较小的索引,并更好地存储在Redis等系统中)应该引入尽可能少的新“活动部件”-我们能够通过很少的工程师扩展Instagram的很大一部分是通过选择我们信任的简单易懂的解决方案。

他们提出了一个基于时间戳的41位系统,13个数据库分片和10个自动增量部分系统。既然你似乎没有使用分片。对于基于时间的共模,你只能有41位,而随机选择只有23位。如果你同时插入记录,那么确实会产生830万的可能性,这是极不可能的。但是实际上,你永远不可能实现这一目标。对,那么一些代码呢:

Generating IDs

START_TIME = a constant that represents a unix timestampdef make_id():    '''    inspired by http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram        '''    t = int(time.time()*1000) - START_TIME    u = random.SystemRandom().getrandbits(23)    id = (t << 23 ) | u    return iddef reverse_id(id):    t  = id >> 23    return t + START_TIME 

注意,

START_TIME
上面的代码是任意的开始时间。你可以使用
time.time()* 1000
,获取值并将其设置为
START_TIME

请注意,

reverse_id
我发布的方法使你可以找出创建记录的时间。如果你需要跟踪该信息,则无需添加其他字段即可!因此,你的主键实际上是在节省存储空间,而不是增加存储空间!

该模型
现在这就是你的模型的样子。

class MyClass(models.Model):   id = models.BigIntegerField(default = fields.make_id, primary_key=True)  

如果你在django之外对数据库进行更改,则需要创建与

make_idsql
函数等效的

作为脚注。这有点像Mongodb 用于为每个对象生成_ID的方法。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/4918978.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-12
下一篇2022-11-12

发表评论

登录后才能评论

评论列表(0条)

    保存