用于搜索目的的关键字到产品映射的数据库设计?

时间:2018-07-09 15:45:17

标签: database database-design

我正在尝试构建搜索功能,以便用户可以在平台上搜索产品

情况1:可以用许多关键字搜索产品。

情况2:关键字可以映射到多个产品。

这就像产品和关键字之间的多对多关系

当前方法:

    productTable: id(primary key)(int)
                  name(string)

    keywordTable: id(primary key)(int)
                  name(string)

    keywordProductMapping: id(primary key)(int)
                           product_id #FK productTable (id) 
                           keyword_id #FK keywordTable(id)

问题陈述::如果我有数百万个产品,并且一个产品说出20到30个关键字,那么keywordProductMapping将会变得太大 并查询该表会非常慢

keywordToProductMapping的任何更好方法

2 个答案:

答案 0 :(得分:1)

您的方法是正确的-在SQL中实现M:N的正确方法是使用带有2个FK的中间表。不过有几点:

  1. 这不会很慢。 Int列很小,因此即使很长的表也可以很好地存储在内存中,并且性能良好。毕竟,对于大多数常见的数据库引擎而言,数千万行是可以的。
  2. 摆脱id上的keywordProductMapping。这是M:N关系上无用的列。 PK应该定义为product_id,keyword_id。这样,表格将变得更小。
  3. 不要忘记FK上的索引。

另一种选择是对关键字(即ElasticSearch)使用专用的系统,该系统在较大的关键字集上可能会表现更好,并会带来一些潜在的增长(部分匹配,词组等)

答案 1 :(得分:0)

对于关系数据库,您的方法似乎完全正常。如果您将此功能用于自动完成功能,并且站点中的流量很高,则将导致大量数据库命中,并可能导致更高的延迟,具体取决于所使用的mysql引擎。

您首先应该确定,您对设计的基本要求是什么,可以在延迟或一致性上做出折衷吗?

如果您想要低延迟和同义词类型的功能,则可以使用Nosql数据库(例如Solr,Elastic Search)预先构建此类功能。这些实际上将帮助您更快地获取数据,从而减少延迟。但是实施此操作将需要一些维护,并及时为数据建立索引。

因此,您应该花一些时间来根据需要确定设计。 希望这可以帮助 !