为了简化我的问题,假设我有一张 table ,里面有很多书籍及其各自的内容。另一方面,我有一个关键字表。我想找到匹配的对。请参阅下面的简单 Perl 脚本,它很好地说明了问题。
#title => content
%books = (
"Foodworld" => "Cheesburgers and Hamburgers are the best you can ...",
"Marvelous Salad" => "Russian dressing is superb when ...",
"Delicious Steaks" => "Only BBQ RipEye"
);
#id => keyword
%keywords = (
"1234" => "Cheeseburgers",
"2345" => "dressing",
"9789" => "Hamburgers"
);
while ( my ($title,$content) = each %books ) {
while ( my ($keywordID, $keyword) = each %keywords ) {
if ( $content =~ /$keyword/ ) {
print "$title \t $keywordID \n";
}
}
}
输出将是:
Marvelous Salad 2345
Foodworld 1234
Foodworld 9789
我的问题是,该书集包含约 70,000 个标题和约 30,000 个单词的关键字列表。两者都位于 MySQL 服务器上的单独表中。有什么建议么?你会如何解决这个任务?你能给我指出一个好的方向吗?
最佳答案
乍一看,这听起来像是您想创建一个 junction table将书籍与关键词相关联。事实上,您可能想要创建两个连接表 --- 一个将标题与关键字相关,另一个将内容与关键字相关。
简单的连接表由多对列组成,每一列都是“REFERENCES FOREIGN KEY”...一个用于“book”ID,另一个用于“key_word”ID。
您仍然需要执行嵌套循环来创建这些连接键引用,并且该表可能会很大(关键字和标题/内容的每个组合都占一行)。但查询可能会非常快。
通过这些联结表中的任何一个,您将获得大约三种类型的简单查询。一个查找包含给定关键字的所有书籍,另一个查找与给定书籍关联的所有关键字,最后一个告诉您给定关键字/书籍组合是否存在。
(其他更复杂的查询可以找到诸如书籍和关键词的交集和差异之类的内容——所有包含对“海豚”和“宠物”的引用的书籍。进一步的考虑也适用词干提取,您可能需要使用一个库将单词规范化为词干)。
连接表通常在其两个列上都有一个复合键(并且通常没有自己的代理键)。这会隐式创建一个索引,同时对该组合施加 UNIQUE 约束。 “REFERENCES FOREIGN KEY”子句还确保关联的引用完整性 --- 并且意味着您必须在创建任何关联之前创建书籍/标题和关键字条目。 (此外,对这些实体的任何删除都需要删除所有连接条目或在 DDL 上使用 CASCADE 选项)。
关于mysql - 如何匹配两个数据库表中的相关值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28705639/