使用 slug 而不是 ID 获取记录

Posted

技术标签:

【中文标题】使用 slug 而不是 ID 获取记录【英文标题】:Fetching records with slug instead of ID 【发布时间】:2010-10-03 17:10:51 【问题描述】:

在处理诸如获取带有特定标签或类别或类似内容的记录之类的情况时,我目前正在尝试找到最佳方法(在可用性和性能方面)。

一个好方法(我想做的方式)是使用标签/类别 slug 获取记录,所以 URL 看起来像:

http://***.com/questions/tagged/language-agnostic

通过slug获取记录,看起来比:

http://***.com/questions/tag/789/language-agnostic

按 ID 获取并在后面添加 slug,这样对搜索引擎更友好。这在性能方面更好,因为通过整数 ID 获取数据会比字符串快。 (cmiiw)

现在,使用如下 db 架构:

posts    post_to_tags    tags
-----    ------------    ----
id       id              id
title    post_id         name
content  tag_id          slug
...                      ...

我做得对吗?为了避免性能问题,我需要知道哪些陷阱或最佳实践? (例如,标签不应超过 10,000 条记录,或标签 slug 不应超过 n 个字符,或其他)

提前致谢。

【问题讨论】:

【参考方案1】:

使用第一个 URL 样式和您当前的数据库设计,您可以这样做:

select ...
from   posts p
join   posts_to_tags pt on pt.post_id = p.post_id
join   tags t on t.id = pt.tag_id
where  t.slug = [url slug value];

只要 tags.slug 被索引,这应该是非常有效的,几乎

有任何不同
select ...
from   posts p
join   posts_to_tags pt on pt.post_id = p.post_id
where  pt.tag_id = [url tag ID];

【讨论】:

在有 10,000 个索引 varchar(30) 标签与整数 1 的情况下,我们所说的差异大约是多少? 好吧,我们只是在讨论使用给定的 slug 值来获取 tag_id 的标签表的一次索引读取,所以它是花生。在 Oracle 上,我刚刚试验了 10,000 次选择,得到了 1.078 和 1.312 秒的时间 - 即每个查询 0.0234 毫秒! 我的意思是,每个查询的差异 0.0234毫秒。 哇,我真的很感激。非常感谢托尼!顺便说一句,你的年龄不错。 请注意,Andy,2 篇文章可能(取决于您的应用程序)具有相同的 slug...在这种情况下,ID 后跟 slug 更好。跨度> 【参考方案2】:

第一个更好,但是可以改变蛞蝓吗?在这种情况下,您需要有一个重定向表(例如,“some-article-about-dogs”现在是“article-about-dogs-and-cats”)。

【讨论】:

以上是关于使用 slug 而不是 ID 获取记录的主要内容,如果未能解决你的问题,请参考以下文章

URL 中的 Rails slugs - 使用 Active Record 模型帖子的 Title 属性而不是 ID

在带有 json api 的 django rest 框架中使用 slug 而不是 ID

ReactJS- 在带有 React 路由器的 URL 中使用 slug 而不是 Id

CakePHP 通过 slug 而不是 ID 过滤列表

在 URL 中显示类别 Slug 而不是 ID

在 Laravel 8 中为 crud 显示 slug 而不是 id