网站搜索引擎使用哪种数据库结构

Which database structure to use for website search engine

编辑 - 数据库设计 C

基于@duskwuff 的解决方案。我相信这也是所谓的 2NF normalised 数据库设计。

我现在担心的是这个设计中存在重复的列值(同一个关键字,如 Apricot 出现在多行中)。随着更多值的添加,数据库中 行数过多 会影响速度或性能吗?


原版post

我正在使用 PHP 和 mySQL 构建网站搜索引擎。目标是搜索水果目录,能够根据用户的各种搜索词找到水果。

例如,如果用户搜索 'Fruit that starts with a'Apples、Apricots 等应该会出现。如果用户搜索 'Fruits with a sweet taste',应该会出现像 Grape、Cranberry、Apricot 等甜味水果。

在设计 A 中,我们将所有 水果名称列为列 。列下方是将导致结果的搜索词。因此,在 Apple 下,您会找到列值:'starts with a''sweet'

在设计 B 中,我们将水果名称作为列值列在标题为 关键字 的列下。每个水果的搜索词是 SearchTerm1、SearchTerm2、 等的相应列值。

哪种数据库设计在速度和可伸缩性方面表现更好?


数据库设计A


数据库设计 B

这两个都是糟糕的数据库设计,因为它们不正确normalized。第一个设计硬编码对象的名称,第二个设计硬编码固定数量的属性;这两种设计查询起来都非常麻烦。

更合适的设计将包含两列 - 水果名称和一个搜索关键字 - 以及每一对水果和关键字的一行。另一种方法是 table 包含水果名称和 ID 编号,第二个 table 将这些 ID 编号与搜索关键字配对。

你有一个多对多的关系。一种水果可以有很多相关的搜索词,一个搜索词可能有很多相关的水果。

Ex: {Apricot -> Sweet taste, starts with a, orange} and {Sweet taste -> apricot, mango} etc.

数据库中做多对多关系的方法就是在中间引入一个table。

让一个水果table拥有所有的水果。在两个 table 中引入合成主键(如果它们没有自然发生的主键)以唯一标识每一行。然后创建中间的 table 并为每对 <fruit, search term> 添加一行。在此 table 的 <pk1, pk2> 上创建索引以使其尽可能快。

我在谷歌搜索后发现了以下 image。它解释了这个想法。

在这个table中,一个品牌的啤酒可以有多个分销商,一个分销商可以分销多个品牌的啤酒。所以我们有中间的 table beer_distributor,它本质上是其他两个 table 的主键的 table,即。 beerdistributor.