Python 如何使UUID-PKs更加可索引

Python 如何使UUID-PKs更加可索引,python,django,postgresql,Python,Django,Postgresql,我使用Postgres作为我的数据库,我的应用程序用Django编写,使用它的ORMAPI。我正在创建一个长度为22+前缀(总共24个)的高质量随机字符串,用作我的对象的主键,如 这是我的关键一代 def make_Key(app_prefix): return app_prefix + base64.b64encode(uuid.uuid4().bytes).decode("utf-8").rstrip('=\n').replace('/', '_').replace(

我使用Postgres作为我的数据库,我的应用程序用Django编写,使用它的ORMAPI。我正在创建一个长度为22+前缀(总共24个)的高质量随机字符串,用作我的对象的主键,如

这是我的关键一代

def make_Key(app_prefix):
    return app_prefix + base64.b64encode(uuid.uuid4().bytes).decode("utf-8").rstrip('=\n').replace('/', '_').replace(
        "+", "-")
我的问题是,在以后这样做时,我是否会遇到索引或速度方面的问题?我不是在寻找int vs UUID的答案,UUID对我的系统来说有更多的优点和缺点。我需要知道的是,我是否可以让它更“可转位”,或者Django中是否有更好的解决方案(也许我这样做没有错?)

我的模型

class Image(models.Model):
    id = models.CharField(primary_key=True, max_length=28, unique=True,
                          default=get_key,editable=False)
  etc

uuid.uuid4将为您提供随机生成的密钥,在该密钥中,您只能散列,但无法获取任何订单信息。我建议您在主键前面加上时间戳,这样您可以大致将其用于b+树索引


你可以参考。

也许考虑顺序GUID:通常不推荐使用UUID作为索引。它们是非顺序的,会导致排序和插入的内存问题。我会保留一个标准的自动递增整数作为索引,并有一个额外的字段来存储您的“键”。@ChrisMontanaro自动递增整数限制了我,不适合我的设置。我明白你关于递增tho的观点,但整数不是答案。我读了instagram做的一些我不知道的事情;我不能完全理解@AlexK。谢谢你的链接,非常有趣的阅读。你不想要一个基于int的解决方案,我听你说,但无论如何都要检查一下:你可以这样做:-它允许你使用一个无冲突的“散列”(它不是真正的散列,而是一个加密的值,所以你可以解密回int)。这样,您可以在视图中加密/解密,并在数据库中保留标准PK。更多优点:您可以定义用于加密值的字母表,最小长度,它在许多平台上都适用。任何不知道salt值的人都无法解密,因此无法从加密的值中确定顺序。通过阅读这篇文章,instagram做到了这一点吗?python中存在一些以时间戳为前缀的连续UUID库。我已经广泛使用了下面的一个:@MarkGalloway若我在时间戳UUID的末尾加上前缀,它还会起作用吗?i、 e_1@OrbiterFleet,生成的最后64位是随机的,因此理论上您可以根据自己的喜好更改它们。