MYSQL DB 存储关键字和索引的最佳方法 URL
MYSQL DB Best method to store keywords and URL index
这些方法中的哪一种是存储、检索、处理和搜索已存储 URL 的大型(数百万条记录)索引以及关键字的最有效方式。
示例 1:(使用一个 table)
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 到另一个的一对一关系)
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 到另一个的一对一关系(使用引用 table))
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))
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 将占用最大的存储空间 space 但是搜索此数据会很快(重复关键字已保存多次,但关键字位于相关域旁边)
w虽然示例 4 会节省大量存储空间 space,但搜索将花费更长的时间。 (不必存储重复的关键字,但是为每个域引用多个关键字会花费更长的时间)
在设计可处理大量数据的数据库时,谁能给我任何见解或想法?有先见之明,您可能希望显示 URL 及其相关关键字,或者搜索一个或多个关键字并调出最相关的 URLs
你做在url和关键字之间有一个多对多的关系。在关系数据库中表示这一点的规范方法是使用桥 table,它对应于您问题中的示例 4。
使用正确的数据结构,您会发现查询将更容易编写,并且尽可能高效。
我不知道是什么驱使您认为在第一个这样的结构中搜索会更快。这要求您在搜索每个单个关键字时进行模式匹配,这非常慢。另一方面,使用联结 table 可以搜索完全匹配,这可以利用索引。
最后,维护这样的结构也容易多了;添加或删除关键字可以使用 insert
和 delete
语句完成,而其他结构要求您在分隔列表中进行字符串操作,这同样是乏味、容易出错且效率低下的。
以上None
只需要一个包含 2 个字符串列的 table:
CREATE TABLE domain_keywords (
domain VARCHAR(..) NOT NULL,
keyword VARCHAR(..) NOT NULL,
PRIMARY KEY(domain, keyword),
INDEX(keyword, domain)
) ENGINE=InnoDB
备注:
- 会更快。
- 写代码会更容易
- 有一个普通的
id
是非常浪费的。
- 规范化域和关键字几乎不会节省 space,但会大大降低效率。
"Huse database"?我预测这个 table 会比你的 Domains
table 小。也就是说,这个 table 不是你主要关心的 "huge".
这些方法中的哪一种是存储、检索、处理和搜索已存储 URL 的大型(数百万条记录)索引以及关键字的最有效方式。
示例 1:(使用一个 table)
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 到另一个的一对一关系)
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 到另一个的一对一关系(使用引用 table))
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))
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 将占用最大的存储空间 space 但是搜索此数据会很快(重复关键字已保存多次,但关键字位于相关域旁边)
w虽然示例 4 会节省大量存储空间 space,但搜索将花费更长的时间。 (不必存储重复的关键字,但是为每个域引用多个关键字会花费更长的时间)
在设计可处理大量数据的数据库时,谁能给我任何见解或想法?有先见之明,您可能希望显示 URL 及其相关关键字,或者搜索一个或多个关键字并调出最相关的 URLs
你做在url和关键字之间有一个多对多的关系。在关系数据库中表示这一点的规范方法是使用桥 table,它对应于您问题中的示例 4。
使用正确的数据结构,您会发现查询将更容易编写,并且尽可能高效。
我不知道是什么驱使您认为在第一个这样的结构中搜索会更快。这要求您在搜索每个单个关键字时进行模式匹配,这非常慢。另一方面,使用联结 table 可以搜索完全匹配,这可以利用索引。
最后,维护这样的结构也容易多了;添加或删除关键字可以使用 insert
和 delete
语句完成,而其他结构要求您在分隔列表中进行字符串操作,这同样是乏味、容易出错且效率低下的。
None
只需要一个包含 2 个字符串列的 table:
CREATE TABLE domain_keywords (
domain VARCHAR(..) NOT NULL,
keyword VARCHAR(..) NOT NULL,
PRIMARY KEY(domain, keyword),
INDEX(keyword, domain)
) ENGINE=InnoDB
备注:
- 会更快。
- 写代码会更容易
- 有一个普通的
id
是非常浪费的。 - 规范化域和关键字几乎不会节省 space,但会大大降低效率。
"Huse database"?我预测这个 table 会比你的 Domains
table 小。也就是说,这个 table 不是你主要关心的 "huge".