【问题标题】:MYSQL DB Best method to store keywords and URL indexMYSQL DB 存储关键字和 URL 索引的最佳方法
【发布时间】:2020-08-03 13:03:57
【问题描述】:

在存储、检索、处理和搜索存储的 URL 的大型(数百万条记录)索引以及其中的关键字时,哪种方法是最有效的方法。

示例 1:(使用一张表)

TABLE_URLs-----------------------------------------------
ID        DOMAIN        KEYWORDS
1         mysite.com    videos,photos,images
2         yoursite.com  videos,games
3         hissite.com   games,images
4         hersite.com   photos,pictures
---------------------------------------------------------

示例 2:(从一个表到另一个表的一对一关系)

TABLE_URLs-----------------------------------------------
ID        DOMAIN        KEYWORDS
1         mysite.com
2         yoursite.com 
3         hissite.com
4         hersite.com
---------------------------------------------------------

TABLE_URL_KEYWORDS---------------------------------------------
ID        DOMAIN_ID     KEYWORDS
1         1             videos,photos,images
2         2             videos,games
3         3             games,images
4         4             photos,pictures
---------------------------------------------------------

示例 3:(从一个表到另一个表的一对一关系(使用引用表))

TABLE_URLs-----------------------------------------------
ID        DOMAIN
1         mysite.com
2         yoursite.com
3         hissite.com
4         hersite.com
---------------------------------------------------------

TABLE_URL_TO_KEYWORDS------------------------------------
ID        DOMAIN_ID     KEYWORDS_ID
1         1             1
2         2             2
3         3             3
4         4             4
---------------------------------------------------------

TABLE_KEYWORDS-------------------------------------------
ID        KEYWORDS
1         videos,photos,images
2         videos,games
3         games,images
4         photos,pictures
---------------------------------------------------------

示例 4:(从 url 到关键字 ID 的多对多关系(使用参考表))

TABLE_URLs-----------------------------------------------
ID        DOMAIN
1         mysite.com
2         yoursite.com
3         hissite.com
4         hersite.com
---------------------------------------------------------

TABLE_URL_TO_KEYWORDS------------------------------------
ID        DOMAIN_ID     KEYWORDS_ID
1         1             1
2         1             2
3         1             3
4         2             1
5         2             4
6         3             4
7         3             3
8         4             2
9         4             5
---------------------------------------------------------

TABLE_KEYWORDS-------------------------------------------
ID        KEYWORDS
1         videos
2         photos
3         images
4         games
5         pictures
---------------------------------------------------------

我的理解是,示例 1 将占用最大的存储空间,但搜索此数据会很快(重复关键字保存多次,但关键字位于相关域旁边)

w而示例 4 将节省大量存储空间,但搜索会花费更长的时间。 (不必存储重复的关键字,但是为每个域引用多个关键字会花费更长的时间)

在设计可以处理大量数据的数据库时,谁能给我任何见解或想法?有远见,您可能希望显示带有相关关键字的 URL,或者搜索一个或多个关键字并显示最相关的 URL

【问题讨论】:

标签: mysql sql database database-design foreign-keys


【解决方案1】:

确实在 url 和关键字之间存在多对多的关系。在关系数据库中表示这一点的典型方法是使用桥接表,它对应于您问题中的示例 4。

使用正确的数据结构,您会发现查询将更容易编写,并且尽可能高效。

我不知道是什么驱使您认为在第一个结构中搜索会更快。这要求您在搜索每个关键字时进行模式匹配,这非常慢。另一方面,使用联结表可以搜索完全匹配,这可以利用索引。

最后,维护这样的结构也容易得多;添加或删除关键字可以使用insertdelete 语句来完成,而其他结构则需要您在分隔列表中进行字符串操作,这又是繁琐、容易出错且效率低下。

【讨论】:

    【解决方案2】:

    以上都不是。

    只需有一个包含 2 个字符串列的表:

    CREATE TABLE domain_keywords (
        domain VARCHAR(..) NOT NULL,
        keyword VARCHAR(..) NOT NULL,
        PRIMARY KEY(domain, keyword),
        INDEX(keyword, domain)
    ) ENGINE=InnoDB
    

    注意事项:

    • 会更快。
    • 写代码会更容易。
    • 拥有一个普通的id 非常浪费。
    • 对域和关键字进行规范化几乎不会节省空间,但会大大降低效率。

    “Huse 数据库”?我预测这张桌子会比你的Domains 桌子小。也就是说,这张表不是你对“巨大”的主要关注。

    【讨论】:

      猜你喜欢
      • 2011-04-15
      • 2023-03-24
      • 1970-01-01
      • 2015-03-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多