通过存储absolute_url消除django中的额外DBQueries

时间:2010-08-28 04:06:09

标签: mysql django optimization

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

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

这看起来非常无害,但它最终会生成另一个博客文章用户的查找,这是我(大多数情况下)已经知道的。然而,这不是我的观点。

网址如下:

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

部分原因是网址有点自我解释,并且不会随着时间而改变。

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

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

{%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添加到对象本身。

我意识到这有点主观,但我真正需要的是扮演魔鬼的人,为什么我不应该这样做,因为它似乎简单明了,我没有看到任何理由不这样做。

1 个答案:

答案 0 :(得分:1)

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

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

  1. 如果您决定出于任何原因更改网址的方案 - 例如迁移到其他顶级域名,或更改路径中的任何元素(例如“/ b”而不是“/ blog”),那么您你的手中有不必要的数据迁移。

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

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