考虑具有多个商店的电子商务应用程序。每个店主都可以编辑他商店的商品目录。
我当前的数据库架构如下:
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
表的picture
和item_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_names
和items: id | name | picture | price | description | picture
作为我可以查询的实用程序表
提前致谢!
参考文献:(1)Is normalizing a person's name going too far?,(2)Avoiding DISTINCT
编辑:如果输入的2个项目名称相似,则看到此内容的管理员只需点击“制作同义词”,即可将其中一个名称转换为另一个名称的同义词。我不需要一种方法来自动检测输入的名称是否是另一个的同义词。我希望自动完成能够处理95%的此类案件。随着表集的大小增加,“Make Synonym”的需求将减少。希望能够解决困惑。
更新:对于那些想知道我继续推进的人...我已经使用了第二个架构但删除了item_names
和item_synonyms
表希望 Solr 能够让我能够执行我需要的所有剩余任务:
item_names
感谢大家的帮助!
答案 0 :(得分:2)
您在评论中声明的要求(“优化搜索”,“处理同义词”和“自动填充”)不是通常与RDBMS相关联的内容。听起来你要解决的是搜索问题,而不是数据存储和规范化问题。您可能希望开始查看某些搜索体系结构,例如Solr
摘自solr功能列表:
基于唯一字段值,显式查询或日期范围的分面搜索
用户查询的拼写建议
更像是对给定文件的建议
自动建议功能
效果优化
答案 1 :(得分:1)
答案 2 :(得分:0)
只是一个想法。
我想到的一件事就是对名称中的字符进行排序,同义词将丢弃所有空格。这类似于查找单词的所有字谜的解决方案。最终结果是能够快速找到类似的条目。正如您所指出的,所有同义词应该聚合成一个单独的术语或名称。使用再次排序的输入字符串对同义词执行搜索。