【问题标题】:django and postgres what is the alternative to uuiddjango 和 postgres 什么是 uuid 的替代品
【发布时间】:2021-09-02 06:57:01
【问题描述】:

我希望我的 Django 项目中所有模型类(表)的所有 ID 字段都是唯一的。唯一我的意思是在所有表中都是唯一的,而不仅仅是一张表。 由于性能和存储问题,我不想使用 UUID,实际上我不需要我的 Id 字段是那种唯一的,我只希望它们可能是 30 个表中的 5 或 6 位唯一数字。 我的数据库是 Postgres。

为什么我需要它: 假设有 3 个表:news、article 和 tag。我想为新闻或文章分配多个标签。所以我将 tag_id 和 news_id article_id 存储在另一个名为 typetag 的表中。 因此新闻和文章不能具有与 django 自动递增主键生成的相似 ID。 我该如何解决这个问题?

【问题讨论】:

  • 您的模型具有一对一字段的额外模型?还是使用The contenttypes framework? (老实说,您不需要 pk 唯一的表)
  • 这种方法可能来自文章或新闻项目,它不适用于来自标签的其他方式,因为您不知道该 id 指的是什么,文章或新闻物品。您应该简单地存储相关项目的类型,例如type: 'news', id: 42。这是一个适当的多态关系,然后这个问题就变得没有意义了。
  • 最好改一下数据模型,让表之间有规律的外键关系。
  • 这能回答你的问题吗? Django models dependencies and transfer ownership 注意:我不在那里讨论 contenttypes 框架,但它也是一个可行的选择。
  • 是的,我可以通过更改设计来解决问题,但是您建议的方法是(我认为)反对规范化(为例如标签和新闻之间的每个关系制作一个额外的表格)@LaurenzAlbe跨度>

标签: python django postgresql database-design


【解决方案1】:

使用 django 中的关系数据库(模型)可以轻松完成您想做的事情。

我们有ManyToOneForeignKey 将一个表的多行与另一个表连接起来。

我们有OneToOne,它将一个表的特定行与另一个表连接起来。

最后,对您有帮助的是ManyToMany,我们可以将一个表的多行与另一个表的多行连接起来。

ManyToMany 在数据库中自动创建一个显示关系的额外表。

查看this了解更多详情。

【讨论】:

  • 我熟悉实体关系:)。当您将拥有超过 10 万条记录时,您应该考虑我将如何查询这些数据以及我将需要哪些数据,同时将数据库设计为尽可能规范化。实体关系可以做很多事情,但其中一些是正确的选择。
【解决方案2】:

如果您的表和行数有限,您可以通过更改主键序列为每个表设置一个唯一的起始值。

例如,假设您有 3 个表,将来每个表最多有 1m 行。您可以将第一个表的序列的起始值设置为1,第二个表为1m,第三个表为2m。如果您的行数超过 1m,请相应地增加它以确保安全。

您可以从 psql 终端或 pgadmin 轻松更改序列的起始值。

    alter sequence seq_name restart with 1;

【讨论】:

  • 是的,你的问题是关于 Django 的,不!只需安装 pg_admin 软件并在那里找到序列名称。如果您不了解序列,可以从 Google 找到更多信息。
  • 我知道数据库的东西,如果我只在数据库端创建这个序列,那么 django 核心功能很可能会与数据库发生冲突,而且在数据库端定义序列不在django 最佳实践
  • 您不会遇到此类问题。有关详细信息,请查看此页面。 stackoverflow.com/questions/50757235/…
猜你喜欢
  • 1970-01-01
  • 2019-05-12
  • 2016-06-14
  • 2016-12-06
  • 2011-06-29
  • 2019-02-22
  • 2011-05-07
  • 2012-04-24
  • 2019-12-03
相关资源
最近更新 更多