代码之家  ›  专栏  ›  技术社区  ›  spider

存储URL的最佳主键

  •  11
  • spider  · 技术社区  · 16 年前

    哪个是存储网站地址和页面URL的最佳主键?

    这种方法在很多方面都很有用:例如,我不需要从数据库中读取最后一个\u id,这样我就可以准备所有表更新,计算键,并在单个事务中执行真正的更新。没有违反约束。

    问题是:URL的自然键是。。。URL本身。事实是,如果一个网站是短的(www.something.com),am URL没有强制限制(请参阅 http://www.boutell.com/newfaq/misc/urllength.html

    考虑到我必须存储(和工作)数以百万计的它们。

    那么,哪把钥匙最好?自动递增的id,url,url散列?

    3 回复  |  直到 16 年前
        1
  •  16
  •   Jamie McCarthy    16 年前

    您需要一个自动递增的数字主键。当您需要传递id或连接其他表(例如,URL的可选属性)时,您需要一些小的数字。

    我想补充一点,使用MySQL的内置MD5()函数就可以了。它唯一的缺点是,一个专门的攻击者可以强制碰撞,我敢肯定你不在乎。例如,使用内置函数可以使某些类型的连接更容易。通过网络传递完整的URL可能会稍微慢一点(“SELECT URL FROM URL WHERE hash=MD5('verylongurl')”而不是“WHERE hash='32charhexstring'”),但是如果您愿意,您可以选择这样做。除非你能想出一个具体的场景,MD5()会让你失望,否则你可以随意使用它。

    困难的问题是,您是否需要以及如何需要以非全文的方式查找URL:例如,您是否希望在任何URL上查找以“/foo”开头的所有URL酒吧网站“主持人?而“喜欢”%酒吧网站%/foo%'将在测试工作,它将失败惨重的规模。如果您的需要包括这样的内容,您可以想出创造性的方法来生成针对您需要的数据类型的非唯一索引。。。也许是一个域名栏,对初学者来说。几乎可以肯定的是,您必须从应用程序中填充这些列(触发器和存储过程的麻烦比它们在这里的价值要大得多,特别是如果您关心性能的话——不用麻烦)。

    好消息是,关系数据库对于这类事情非常灵活。您可以随时添加新列并在以后填充它们。我建议初学者:int unsigned auto\u increment主键、惟一散列字符(32)和(假设64K字符足够)文本url。

        2
  •  2
  •   O. Jones    16 年前

    大概你说的是一个完整的URL,而不仅仅是一个主机名,包括CGI参数和其他东西。

    SHA-1散列url使得所有的键都很长,并且使得排序问题变得相当模糊。我曾经不得不使用哈希表上的索引来隐藏一些机密数据,同时保持连接两个表的能力,性能很差。

    但如果你有很多网址集中在几个领域。。。例如。。。。

    http://stackoverflow.com/questions/3735390/best-primary-key-for-storing-urls
    http://stackoverflow.com/questions/3735391/how-to-add-a-c-compiler-flag-to-extconf-rb
    

    等等,你看到的索引只在最后一个字符中变化。在这种情况下,您可以考虑存储和索引url,并反转其字符顺序。这可能导致更有效地访问索引。

    (Oracle table server产品有一种内置的方法,即所谓的反向索引)

    如果我是你,我会避免使用自动递增键,除非你必须连接两个以上的表 ON TABLE_A.URL = TABLE_B.URL 或者其他一些与这种方法有关的条件。

        3
  •  1
  •   Bozho    16 年前

    取决于你如何使用桌子。如果你选择 WHERE url='<url>'

    推荐文章