Indexing 如何在URL缩短服务中进行索引

Indexing 如何在URL缩短服务中进行索引,indexing,database-design,architecture,url-shortener,system-design,Indexing,Database Design,Architecture,Url Shortener,System Design,我正在学习设计系统。第一个用例是URL缩短服务。我已经读到,我们可以在RDBMS中存储短url、长url对。因为根据要求,我们应该能够将短url映射到长url(这样就可以将其发送到调用客户端),也可以将长url映射到短url(这样就不会再次缩短现有的映射长url)。我的问题是如何在RDBMS中高效地完成这些映射/查找。简单的答案是,短url上的索引和长url上的索引都是维护的。我想探讨一下它的细节,比如在RDBMS中这两种情况下的索引技术。从您的描述中我可以收集到,您实际上并不是在“映射”任何东

我正在学习设计系统。第一个用例是URL缩短服务。我已经读到,我们可以在RDBMS中存储短url、长url对。因为根据要求,我们应该能够将短url映射到长url(这样就可以将其发送到调用客户端),也可以将长url映射到短url(这样就不会再次缩短现有的映射长url)。我的问题是如何在RDBMS中高效地完成这些映射/查找。简单的答案是,短url上的索引和长url上的索引都是维护的。我想探讨一下它的细节,比如在RDBMS中这两种情况下的索引技术。

从您的描述中我可以收集到,您实际上并不是在“映射”任何东西,您只需要存储一个URL及其简短的等价物

所以除非有其他信息,我会倾向于

create table URLs (
Id int identity(1,1),
  LongURL varchar(200),
  ShortURL varchar(20),
  CreateDate datetime default (getdate())
)

create unique clustered index IdxShortURL on URLs (ShortURL)
create nonclustered index IdxLongURL on URLs (LongURL)
首先,您将查找给定短url的长url,因此这是索引唯一且群集的,数据库可以直接查找并返回完整url

您可以使用LongURL上的非聚集索引检查是否存在已存在的URL

编辑

扩展索引策略—这实际上取决于预期的使用情况。在监视查询执行计划之后,通常会出现正确的索引策略

是的,两者都是类似的字符列,但——这是我的假设——长URL主要是使用短URL查找的,而不是相反的情况,即,我有短URL,我需要查找长URL——在这种情况下,短URL与表的“Id”同义,它是您访问其他信息的关键

通过将短URL指定为唯一且聚集的,表中的数据将按短URL进行物理排序,并且当使用短URL查找行时,等效的长URL将立即作为索引叶级的一部分可用,并且单个查找操作可以检索它

相反,我的假设是,如果某个URL已经存在,您不想添加该URL,而检查该URL是否存在将通过查找长URL来完成,因此在此列上单独的索引就足够了;即使您需要检索短URL作为查找的一部分,因为URL是唯一的,所以它只是一个书签查找,非常快速和高效


YMMV,但希望这与您的意图一致。

从您的描述中,我可以收集到,您实际上并不是在“映射”任何内容,您只需要存储一个URL及其相应的简短内容

所以除非有其他信息,我会倾向于

create table URLs (
Id int identity(1,1),
  LongURL varchar(200),
  ShortURL varchar(20),
  CreateDate datetime default (getdate())
)

create unique clustered index IdxShortURL on URLs (ShortURL)
create nonclustered index IdxLongURL on URLs (LongURL)
首先,您将查找给定短url的长url,因此这是索引唯一且群集的,数据库可以直接查找并返回完整url

您可以使用LongURL上的非聚集索引检查是否存在已存在的URL

编辑

扩展索引策略—这实际上取决于预期的使用情况。在监视查询执行计划之后,通常会出现正确的索引策略

是的,两者都是类似的字符列,但——这是我的假设——长URL主要是使用短URL查找的,而不是相反的情况,即,我有短URL,我需要查找长URL——在这种情况下,短URL与表的“Id”同义,它是您访问其他信息的关键

通过将短URL指定为唯一且聚集的,表中的数据将按短URL进行物理排序,并且当使用短URL查找行时,等效的长URL将立即作为索引叶级的一部分可用,并且单个查找操作可以检索它

相反,我的假设是,如果某个URL已经存在,您不想添加该URL,而检查该URL是否存在将通过查找长URL来完成,因此在此列上单独的索引就足够了;即使您需要检索短URL作为查找的一部分,因为URL是唯一的,所以它只是一个书签查找,非常快速和高效


YMMV,但希望这与您的意图一致。

您想详细说明为什么选择聚集索引作为一个索引,而选择非聚集索引作为另一个索引。从索引的角度来看,短URL和长URL似乎都是一样的。当然,我在文章中补充道,更详细的解释对于评论来说太多了。您想详细说明一下为什么选择聚集索引作为一个索引,而选择非聚集索引作为另一个索引吗。从索引的角度来看,短URL和长URL似乎都是一样的。当然,我在文章中补充道,更详细的解释对评论来说太多了。