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

Rab*_*ire 6 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)
Run Code Online (Sandbox Code Playgroud)

注意:error表示拼写错误(例如"Ericson").description并且pictureitem_names表是"全局",可以选择性地被"本地" description和表的picture字段覆盖items(如果商店所有者想要为项目提供不同的图片).common帮助分离独特的项目名称("吉米乔的奶酪披萨"与"芝士披萨")

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

优化搜索和处理同义词:我可以查询item_names&item_synonymstables使用name LIKE %QUERY%并获取item_name_id需要与items表连接的s 列表.(同义词的例子:"Sony Ericsson","Sony Ericson","X10","X 10")

自动完成:再次,对item_names表的简单查询.我可以避免使用DISTINCT它并最大限度地减少变化的数量("索尼爱立信Xperia™X10","索尼爱立信Xperia X10","Xperia X10,索尼爱立信")

不利方面是:

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

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

items: id | name | picture | price | description | picture
Run Code Online (Sandbox Code Playgroud)

(... item_namesitem_synonyms我可以查询的实用程序表)

  • 你建议有更好的架构吗?
  • 是否应将项目名称标准化为自动完成?这可能是Facebook为"学校","城市"条目所做的事情吗?
  • 第一个架构或第二个架构是否更好/最适合搜索?

提前致谢!

参考文献:(1)正常化一个人的名字走得太远了吗?,(2)避免DISTINCT


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


更新:对于那些想谁知道我就做了......我已经与第二模式,但删除item_namesitem_synonyms表格在希望的Solr会为我提供执行所有剩余的任务,我需要的能力:

items: id | name | picture | price | description | picture
Run Code Online (Sandbox Code Playgroud)

谢谢大家的帮助!

Mar*_*zzi 2

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

摘自solr功能列表:

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

针对用户查询的拼写建议

针对给定文档的更多类似建议

自动建议功能

性能优化