我是不是应该使用字符串作为对 SEO 很重要的网站的主键?

Posted

技术标签:

【中文标题】我是不是应该使用字符串作为对 SEO 很重要的网站的主键?【英文标题】:Should I use strings as primary keys for a Web site that's big on SEO?我是否应该使用字符串作为对 SEO 很重要的网站的主键? 【发布时间】:2009-08-11 02:23:26 【问题描述】:

嗨。我正在建立一个展示大量产品的网站。 我希望 URL 人性化并针对搜索引擎进行优化,因此我希望产品的过滤能够反映在 URL 中。 例如,用于过滤产品的可能 URL 路径是

website.com/Type/Car/Country/Usa/Manufacturer/Ford/Year/2007

所以这是我的问题,因为我一直在弄清楚如何根据这些字符串过滤数据库,在这种情况下使用字符串作为主键绝对有意义吗?就性能而言.

我已阅读此 *** 问题的答案 Strings as Primary Keys in SQL Database 那里的人说这取决于字符串的大小和其他因素,但在我看来,在这种情况下,因为我总是要在不同的表中搜索字符串,所以该字符串是主要的是有意义的。另一种方法是将整数设置为主键,但我仍然会搜索非主字符串并从中找出主键。根据我对数据库的了解,这是一个坏主意,因为它们存储数据的方式是搜索主键比搜索任何其他字段都快。我使用的是 MS SQL Server 2005。谢谢。

【问题讨论】:

【参考方案1】:

由于几个原因,该 URL 会导致主键错误 - 一个是每次插入新记录时,您的页面都会出现碎片,因为它必须对整个表进行物理重组并将新记录按字母顺序粘贴在它所属的位置。索引 URL 列,您将获得所需的所有查找性能。每次插入时重建索引在某些方面比重建表更可取。

另一个(正如 Josh 指出的那样)是 URL 高度相似,因此比较将非常慢(与 int 相比) - 对于两个项目 - 20072008website.com/Type/Car/Country/Usa/Manufacturer/Ford/Year/ 中,你必须覆盖很多地方——56 个字符(加上200 的三个字符),然后才能找到唯一的。

【讨论】:

确实,URL 尤其成问题,因为它们总是会导致大量的最小比较。前几个字符 ("www") 几乎总是匹配。【参考方案2】:

不,字符串比较将比整数比较慢得多(这是选择主键时考虑的主要性能影响)。您想要的是字符串上的 index,它可以提高搜索字符串列的性能。主键不是存储用于搜索列的预计算数据的唯一方法。

【讨论】:

【参考方案3】:

请不要。

如果您正在搜索字符串,请索引该列。但老实说,保留整数主键要好得多。您不知道是否需要更改字符串。

此外,字符串的比较和连接要慢得多。跨多个表和一堆行,这会很痛苦。

我从来没有见过我喜欢的字符串 PK 的实现。请,请使用整数并索引您的列。你的生活会好很多。

【讨论】:

【参考方案4】:

我想指出,主键和聚集索引之间是有区别的。 PK 可以由非聚集索引维护,在这种情况下,当插入新项目时,不会重新排列整个表。

我建议在代理键上使用聚集索引,但如果您希望使用唯一索引作为主键,那也可以。您可以在任何唯一索引上使用外键,无论它是否聚集,也不管它是否是主键。

对于 PK 使用自然键(如您所描述的)有相当强烈的论据。只是它下面没有聚集索引,因为 CIX 几乎不应该在这样的字符串上。

罗伯

【讨论】:

【参考方案5】:

如果您查看 SO URL,您会注意到它们确实不是实际上存储了键的字符串,而是项目(问题)ID。 URL 是带有人类可读描述的修饰,但这与映射完全无关。所以打开 url Should I use strings as primary keys for a Web site that's big on SEO? 和打开 Should I use strings as primary keys for a Web site that's big on SEO? 一样打开 https://***.com/questions/1258198

所以你看,http请求和url映射中发生的事情并不是存储在数据库中的。出于明显的性能和存储原因,数据库使用 int ID,这些原因已在之前的答案中解决。

【讨论】:

我没有注意到这一点,我会记住这是一个非常有趣的解决方案。谢谢你。但是,在这种情况下,我认为不能使用这样的方法。我在问题中描述的 URL 将返回一组记录,而不是一条记录。它将归还福特当年生产的所有可用汽车。如果我在表达我的问题时不清楚这一点,我很抱歉。【参考方案6】:

    您可能需要考虑使用字符串的哈希作为索引/键,而不是字符串本身。这将有助于避免查询中代价高昂的字符串比较。

    数据能否比 URL 方案更有效?您可能需要一个简单的整数主键和字符串的辅助键/索引。这样,如果您必须使用字符串索引回溯您的步骤,外键关系仍然存在。

    您是否考虑过如何规范化 URL 字符串以确保正确映射到记录?例如是年==年和福特/2007==2007/福特?这样的路径应该映射到同一个记录吗?

【讨论】:

散列是非常原始的解决方案。恐怕它会破坏使用独立整数的好处。由于插入可能出现在表的中间,而且如果字符串发生变化,散列函数输出的整数也会发生变化。关于不同的路线都指向同一个位置,我考虑过,确实很痛苦。我可以在我的应用中处理它,但我知道 Google 会惩罚多个地址指向相似内容的网站。【参考方案7】:

我认为这里有一个字符串作为 PK 是可以的,因为汽车制造商的列表很小(200 个?)。甚至汽车模型的列表也没有那么大(20000?)。 如果您进一步深入细节,那么您将不再对字符串键感到满意。每辆车的轮辋/轮胎列表非常多。

您将遇到的问题是您不能在 URL“Alfa Romeo”中包含名称。为了让它对人类友好,我会将其更改为“Alfa-Romeo”并将其作为 PK 和 URL,但将原始名称保留为可读名称。汽车模型的问题变得更糟。

尤其是法国人在这辆“雷诺梅甘娜”上表现得非常糟糕。您需要为此查看“Unicode decomposition”

我不喜欢代理键的想法是,汽车的名称不会经常更改,但您的代理键会。

【讨论】:

【参考方案8】:

我不同意整数键总是最好的。当然,通过整数查找会更快。但事实上,如果您必须执行的访问将始终或几乎始终是文本值,那么如果您有记录 id 来查找,它会更快,这几乎是无关紧要的。按顺序,只要你事先知道中奖彩票号码,你就可以用那个号码买彩票,发家致富。毫无疑问的真实陈述,但如果您没有提前知道中奖彩票号码,则没有用处。

所以真正的问题是:您需要在数据库中存储什么,以及如何访问它?如果 99% 的访问是“获取 URL 并查找记录”,那么使用 URL 或从 URL 派生的东西可以说是一个好主意。

我反对它的主要论点不是它是一个字符串,而是它是一个结合了许多不同事实的字符串。你曾经关心过这些碎片吗?比如,你会不会想说,“找到我所有的福特车”?如果是这样,那么将“福特”卡在主键中间是一个非常非常糟糕的主意。找到所有 Fords 的唯一方法是全文件顺序搜索,查找键中间的字符“Ford”。丑陋。最好有一个单独的“make”字段供您搜索。

我不了解您的应用程序,但我怀疑从 URL 转到记录并不是唯一的访问。是不是有某种浏览或搜索功能,用户可能会说,“给我找出所有不到 10 年的敞篷车”或类似的东西?如果是这样,您确实需要将数据分解为单独的字段才能进行搜索。

另外,当您检索此 URL 时,您会获得什么数据?您是只获得一张唱片并显示它,还是有很多唱片挂在上面?如果有相关记录,那么如果 URL 是“起始”记录的主键,那么所有这些相关记录也必须持有那个大 URL 作为外键。这可能会变得混乱。在决定索引之前,您应该考虑数据库的整体结构——需要哪些表以及它们之间的关系。 (嘿,这听起来像是为我的书“A Sane Approach to Database Design”添加一个无耻插件的好地方,我在其中讨论了设计注意事项以及您应该做出设计决策的顺序。)

一个细节,但可能是一个大细节:您真的需要其中的细分名称以及值吗?也就是说,不是将 URL 设为“website.com/Type/Car/Country/Usa/Manufacturer/Ford/Year/2007”,而不能只是“website.com/Car/Usa/Ford/2007”吗?这将消除大量冗余文本。顺便说一句,如果您只处理一个网站,那么您的所有 URL 都以“website.com”开头,那么您肯定不需要将其存储在每条记录中。哦,订单重要吗?有人可以提供 URL“webiste.com/Year/2007/Type/Car/Manufacturer/Ford/Country/Usa”并获得相同的信息吗?如果是这样,事情就会变得复杂得多。

里面除了汽车还有其他东西吗?比如,可以有“website.com/Type/Pet/Kind/Dog/Breed/Poodle”之类的吗? (或者省略标签,“/Pet/Dog/Poodle”。)如果是这样,使用 URL 的通用方案看起来比试图将其分解为单个字段的更具体的方案好一点。也许吧。

【讨论】:

以上是关于我是不是应该使用字符串作为对 SEO 很重要的网站的主键?的主要内容,如果未能解决你的问题,请参考以下文章

文章内容的权威性对SEO的作用?

养成几种seo好习惯,让你网站推广更高效

SSL证书对SEO网站优化的影响

什么是H1标签?2021 年SEO最佳实践

什么是H1标签?2021 年SEO最佳实践

优化网站优化网页代码