【问题标题】:Eliminating extra DBQueries in django by storing the absolute_url通过存储 absolute_url 在 django 中消除额外的 DBQueries
【发布时间】:2013-11-22 02:17:21
【问题描述】:

使用 Django 博客,我有一个看起来像这样的模板:

<a href="{{ post.get_absolute_url }}">{{ post.title }}</a>

这看起来很无害,但它最终会生成博客文章用户的另一个查找,这是我(在大多数情况下)已经知道的。不过这不是我的意思。

网址如下:

http://localhost:8000/blog/post/mark/2010/08/Aspect-Oriented-Prog/

它看起来像这样的部分原因是 URL 在某种程度上是不言自明的,并且不会随着时间而改变。

我非常好奇的是,将此 URL 与博客文章一起存储在数据库中可能会出现什么问题?如果它不应该改变,我将它存储在那里,然后获取博客,给我绝对 URL,而无需获取用户并重建 URL。

我认为我存储的部分不包括 /blog/post,但包含帖子特定信息,以便我可以这样做:

{% url blog-post blog %} 并将其粘贴在一起。

只是为了记录,是的,我可以做 selected_related,除了在我的情况下,我实际上是从我正在获取对象的活动日志中返回的:

def get_edited_object(self):
    "Returns the edited object represented by this log entry"
    return self.content_type.get_object_for_this_type(pk=self.object_id)

我还没有弄清楚如何添加与此相关的选择,但想知道我是否需要,因为我可以将 absolute_url 添加到对象本身。

我意识到这有点主观,但我真正需要的是有人为我为什么不应该这样做,因为它看起来简单明了,我看不出有什么理由不这样做。

p>

【问题讨论】:

  • 我正在使用 mysql,但不知道为什么这很重要。对具有有意义且持久的 URL 的资源进行非规范化有什么缺点?

标签: mysql django optimization


【解决方案1】:

我相信这是规范化与非规范化的案例。规范化学校会争辩说,如果您有必要的信息来创建数据库中可用的 URL,那么您应该计算它而不是存储和检索。非规范化会让你不用每次都计算它。

我会尝试扮演魔鬼的拥护者。我有两个论点。

  1. 如果您出于任何原因决定更改 URL 的架构 - 例如迁移到另一个顶级域,或更改路径中的任何元素(例如“/b”而不是“/blog”),那么您会在您手中进行不必要的数据迁移。

  2. 允许用户编辑博客文章。如果用户更改了她博客文章的标题,则必须再次生成 slug,这反过来意味着必须再次计算和存储 URL。

  3. 如果用户句柄可以更改(我知道这不太可能,但我见过允许您这样做的网站),那么您必须重新计算和存储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-23
    • 2014-06-08
    • 2011-12-21
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多