基于@ duskwuff的解决方案。我相信这也是所谓的 2NF normalised数据库设计。
我现在关注的是,此设计中存在重复的列值(同一个关键字,如杏出现在多行中)。随着更多值的添加,具有太多行的数据库是否会影响速度或性能?
原帖
我正在使用PHP和mySQL构建网站搜索引擎。目标是在水果目录中搜索能够根据用户的各种搜索词找到水果的能力。
例如,如果用户搜索以“”开头的'Fruit,则应该出现 Apples,Apricots 等。如果用户搜索'带有甜味的水果',那么应该出现像 Grape,Cranberry,Apricot 等甜味水果。
在设计A中,我们将所有水果名称列为列。在列下面将是将导致水果的搜索术语。因此,在 Apple 下,您会找到列值:'以'开头,'甜蜜'
在设计B中,我们将列出的水果名称替换为标题为关键字的列下的列值。每个相应水果的搜索字词是 SearchTerm1,SearchTerm2,等各自的列值。
哪种数据库设计在速度和可扩展性方面表现更好?
答案 0 :(得分:1)
这两个都是糟糕的数据库设计,因为它们不正确normalized。第一个设计硬编码对象的名称,第二个设计硬编码固定数量的属性;这两种设计都非常麻烦。
更合适的设计将包含两列 - 水果名称和一个搜索关键字 - 以及每个水果和关键字配对的一行。另一种方法是让一个表格包含水果名称和ID号码,另一个表格将这些ID号码与搜索关键字配对。
答案 1 :(得分:1)
你有很多关系。一个水果可以有许多相关的搜索词,一个搜索词可能有很多与之相关的成果。
Ex:{Apricot - >甜美的味道,开始于橙色}和 {甜味 - >杏,芒果等等。
在数据库中建立多对多关系的方法是在中间引入一个表。
让一张水果桌上有所有的水果。在两个表中引入合成主键(如果它们没有自然发生的主键)以唯一标识每一行。然后创建中间表,并为每对<fruit, search term>
添加一行。在此表的<pk1, pk2>
上创建一个索引,以尽可能快地保持它。
我在谷歌搜索后发现了以下image。它解释了这个想法。
在此表中,一个品牌的啤酒可以有多个分销商,分销商可以分销多个品牌的啤酒。所以我们有中间表beer_distributor
,它基本上是另外两个表的主键表。 beer
和distributor
。