我正在尝试构建搜索功能,以便用户可以在平台上搜索产品
情况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
的任何更好方法
答案 0 :(得分:1)
您的方法是正确的-在SQL中实现M:N
的正确方法是使用带有2个FK的中间表。不过有几点:
id
上的keywordProductMapping
。这是M:N
关系上无用的列。 PK应该定义为product_id,keyword_id
。这样,表格将变得更小。另一种选择是对关键字(即ElasticSearch)使用专用的系统,该系统在较大的关键字集上可能会表现更好,并会带来一些潜在的增长(部分匹配,词组等)
答案 1 :(得分:0)
对于关系数据库,您的方法似乎完全正常。如果您将此功能用于自动完成功能,并且站点中的流量很高,则将导致大量数据库命中,并可能导致更高的延迟,具体取决于所使用的mysql引擎。
您首先应该确定,您对设计的基本要求是什么,可以在延迟或一致性上做出折衷吗?
如果您想要低延迟和同义词类型的功能,则可以使用Nosql数据库(例如Solr,Elastic Search)预先构建此类功能。这些实际上将帮助您更快地获取数据,从而减少延迟。但是实施此操作将需要一些维护,并及时为数据建立索引。
因此,您应该花一些时间来根据需要确定设计。 希望这可以帮助 !