我即将为我们未来的网站制作一个(简单?)搜索引擎,我想要一些有关问题的建议。
网站上的内容将有标签连接到它们,但我不知道如何以正确的方式存储它们。为了简单起见,1 个标题带有多个标签。我有两种解决方案,我想请您了解哪一种更好,或者说另一种解决方案;)
将标题存储在一个表中,将标签存储在另一表中。每个标签都有一个 titleId。当用户搜索某些内容时,数据库会在两个表中搜索并同时返回结果。 + 需要存储的数据更少。 - 在多个表中搜索
将标题存储在一个表中,将标签存储在另一表中。虽然每个标题都有一个与标题同名的标签。这样,数据库只需在一张表中进行搜索即可。
我说“性能就是一切”,但你觉得呢?
您想要做的是使用多对多关系。有效的方法是使用连接表。这是我的设置方式
create table page (
id int(11) not null auto_increment,
title varchar(128)
...
) engine = innodb;
create table tag (
id int(11) not null auto_increment,
tag_name varchar(128)
) engine = innodb;
create table page_tag (
id int(11) not null auto_increment,
tag_id int(11) not null,
page_id int(11) not null,
foreign key(tag_id) references tag(id),
foreign key(page_id) references page(id),
unique key(tag_id, page_id)
) engine=innodb;
确保使用 innodb 表来强制引用完整性。如果您需要全文搜索,请添加一个额外的 myISAM 表,该表基本上复制您的标记表。 page_tag 中的唯一键可防止其中出现重复条目,并使该表上的联接更快。
我还想说你应该选择#2。这样你每次都搜索一张桌子,这可能更容易处理。