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

时间:2011-01-04 06:12:53

标签: 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)

注意:error表示拼写错误(例如“Ericson”)。 description表的pictureitem_names“globals”,可以选择由“local”覆盖 {{1} description表的{}和picture字段(如果商店所有者想要为商品提供不同的图片)。 items帮助区分独特的商品名称(“Jimmy Joe's Cheese Pizza”和“Cheese Pizza”)

我认为这个架构的好处是:

优化搜索&处理同义词:我可以查询common&使用item_names的{​​{1}}个表,并获取需要与item_synonyms表连接的name LIKE %QUERY%列表。 (同义词的例子:“Sony Ericsson”,“Sony Ericson”,“X10”,“X 10”)

自动完成:再次,对item_name_id表的简单查询。我可以避免使用items并最大限度地减少变化(“索尼爱立信Xperia™X10”,“索尼爱立信Xperia X10”,“Xperia X10,索尼爱立信”)

不利方面是:

开销插入项目时,我查询item_names以查看此名称是否已存在。如果没有,我创建一个新条目。当删除项目时,我会计算具有相同名称的条目数。如果这是唯一具有该名称的项目,我会从DISTINCT表中删除该条目(只是为了保持清洁;考虑可能的错误提交)。 更新是两者的结合。

奇怪的物品名称:店主有时会使用“哈利波特1,2书+ CD +魔术帽”之类的句子。有这么多开销来容纳这样的案例。这可能是主要原因我很想去寻找这样的架构:

item_names

(... item_namesitems: id | name | picture | price | description | picture 作为我可以查询的实用程序表

  • 您建议使用更好的架构吗?
  • 项目名称是否应针对自动完成进行标准化?这可能是Facebook为“学校”,“城市”条目所做的事情吗?
  • 第一个架构或第二个架构是否更好/最适合搜索?

提前致谢!

参考文献:(1)Is normalizing a person's name going too far?,(2)Avoiding DISTINCT


编辑:如果输入的2个项目名称相似,则看到此内容的管理员只需点击“制作同义词”,即可将其中一个名称转换为另一个名称的同义词。我不需要一种方法来自动检测输入的名称是否是另一个的同义词。我希望自动完成能够处理95%的此类案件。随着表集的大小增加,“Make Synonym”的需求将减少。希望能够解决困惑。


更新:对于那些想知道我继续推进的人...我已经使用了第二个架构但删除了item_namesitem_synonyms表希望 Solr 能够让我能够执行我需要的所有剩余任务:

item_names

感谢大家的帮助!

3 个答案:

答案 0 :(得分:2)

您在评论中声明的要求(“优化搜索”,“处理同义词”和“自动填充”)不是通常与RDBMS相关联的内容。听起来你要解决的是搜索问题,而不是数据存储和规范化问题。您可能希望开始查看某些搜索体系结构,例如Solr

摘自solr功能列表:

  

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

     

用户查询的拼写建议

     

更像是对给定文件的建议

     

自动建议功能

     

效果优化

答案 1 :(得分:1)

答案 2 :(得分:0)

只是一个想法。

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