Database 存储用户提交的项目名称(及其同义词)的最佳方法

Database 存储用户提交的项目名称(及其同义词)的最佳方法,database,database-design,normalization,denormalization,Database,Database Design,Normalization,Denormalization,考虑一个具有多个商店的电子商务应用程序。每个店主都可以编辑其店铺的商品目录 我当前的数据库架构如下所示: item_names: id | name | description | picture | common(BOOL) items: id | item_name_id | picture | price | description | picture item_synonyms: id | item_name_id | name | error(BOOL) 注:错误表示拼写错误(如“E

考虑一个具有多个商店的电子商务应用程序。每个店主都可以编辑其店铺的商品目录

我当前的数据库架构如下所示:

item_names: id | name | description | picture | common(BOOL)
items: id | item_name_id | picture | price | description | picture
item_synonyms: id | item_name_id | name | error(BOOL)
注:
错误
表示拼写错误(如“Ericson”)<
商品名称
表的code>说明和
图片
是“全局”的,可以选择被
商品
表的“本地”
说明
图片
字段覆盖(以防店主想为商品提供不同的图片)
common
帮助区分独特的商品名称(“吉米·乔奶酪比萨”和“奶酪比萨”)

我认为这种模式的好的一面是:

优化搜索和处理同义词:我可以使用
name LIKE%query%
查询
项目名称
项目同义词
表,并获得需要与
项目
表联接的
项目名称id
列表。(同义词示例:“索尼爱立信”、“索尼爱立信”、“X10”、“X10”)

自动完成:再次是对
项目名称的简单查询。我可以避免使用
DISTINCT
,它可以最大限度地减少变化(“索尼爱立信Xperia”)™ “索尼爱立信-Xperia X10”、“Xperia X10,索尼爱立信”)

不利的一面是:

开销:插入项目时,我查询
项目名称
以查看该名称是否已存在。如果没有,我将创建一个新条目。删除项目时,我会计算同名项目的数量。如果这是唯一具有该名称的项目,我将从
item\u names
表中删除该条目(只是为了保持整洁;说明可能的错误提交)。更新是两者的结合

奇怪的商品名称:店主有时会使用“哈利波特1,2本书+CD+魔法帽”这样的句子。有这么多的开销来适应这样的情况是有点不对劲的。这可能是我倾向于采用以下模式的主要原因:

items: id | name | picture | price | description | picture
(…使用
item_名称
item_同义词
作为我可以查询的实用程序表)

  • 你有没有更好的方案
  • 是否应该为自动完成规范化项目名称?这可能是Facebook为“学校”、“城市”条目所做的吗
  • 第一种模式还是第二种模式更适合搜索
提前谢谢

参考文献:(1)、(2)


编辑:如果输入了两个名称相似的项目,管理员只需单击“生成同义词”,即可将其中一个名称转换为另一个名称的同义词。我不需要一种方法来自动检测输入的名称是否是另一个名称的同义词。我希望自动完成将处理95%的此类案件。随着表集大小的增加,“生成同义词”的需求将减少。希望这能消除混乱


更新:给那些想知道我接下来做了什么的人。。。我使用了第二个模式,但删除了
item\u名称
item\u同义词
表,希望Solr能够为我提供执行所有剩余任务的能力:

items: id | name | picture | price | description | picture
谢谢大家的帮助

只是个想法


我脑海中浮现的一件事是将名字和同义词中的字符进行排序,将所有空格都扔掉。这类似于查找单词的所有字谜的解决方案。最终的结果是能够快速找到类似的条目。正如您所指出的,所有同义词都应该聚合为一个术语或名称。使用再次排序的输入字符串对同义词执行搜索

如果有更多属性用于映射,我建议使用快速搜索索引系统。添加记录时无需设置别名,属性只需编制索引,发出的每个搜索返回匹配的相关性分数。将前X%作为有效匹配项并显示它们


创建和存储别名似乎是一种蛮力的劳动密集型方法,可能无法适应用户的需要。

您在评论中陈述的要求(“优化搜索”、“处理同义词”和“自动完成”)通常与RDBMS无关。听起来您试图解决的是搜索问题,而不是数据存储和规范化问题。您可能想开始研究一些搜索架构,如

摘自solr功能列表:

基于唯一字段值、显式查询或日期范围的分面搜索

用户查询的拼写建议

更像是对给定文档的建议

自动建议功能

性能优化


这是一种很好的存储字谜的方法,如果删除空白的排序字符是相同的,则单词彼此是同义的。但我不想在用户搜索“pots”时返回“top”。)开始悬赏。希望从所有的ye DB大师那里得到更多的答案。我认为问题在于我们不清楚您的要求。我将提出我认为正在发生的事情。你相当于亚马逊。不止一个卖家可以提供{Nike Air Jordon Red/White 10.5US}。但是他们都可以用不同的名字来称呼他们,所以你有一个规范化的问题。这些不是有通用PK的SKU物品。那么你是想通过比较名字中的字符来推断出这两个东西实际上是一样的?你认为这是一个正确模式的问题吗?我不明白。我的要求是“优化搜索”、“处理同义词”和“自动完成”。用户尝试从文本字段输入项目。“自动完成”尝试防止同一个版本出现过多变化