6

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

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

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全局”,可以选择被“本地”和表的字段覆盖(以防店主想要为商品提供不同的图片)。有助于区分独特的项目名称(“Jimmy Joe's Cheese Pizza”与“Cheese Pizza”)item_names descriptionpictureitemscommon

我认为这个模式的好处是:

优化查找&处理同义词:可以使用item_names&item_synonyms表查询name LIKE %QUERY%,获取item_name_id需要与items表连接的s列表。(同义词示例:“Sony Ericsson”、“Sony Ericson”、“X10”、“X 10”)

自动完成:同样,对表的简单查询item_names。我可以避免使用DISTINCT并最大限度地减少变化的数量(“Sony Ericsson Xperia™ X10”、“Sony Ericsson - Xperia X10”、“Xperia X10、Sony Ericsson”)

不利的一面是:

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

奇怪的物品名称:店主有时会使用“哈利波特 1、2 本书 + CD + 魔法帽”之类的句子。有这么多开销来适应这样的情况是有问题的。这可能是我很想采用这样的模式的主要原因:

items: id | name | picture | price | description | picture

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

  • 您会建议更好的架构吗?
  • 是否应该为自动完成标准化项目名称?这可能是 Facebook 为“学校”、“城市”条目所做的吗?
  • 第一个模式还是第二个模式更好/最适合搜索?

提前致谢!

参考文献: (1)规范一个人的名字是否太过分了?, (2)避免 DISTINCT


编辑:如果输入了 2 个具有相似名称的项目,看到此内容的管理员只需单击“制作同义词”,这会将其中一个名称转换为另一个名称的同义词。我不需要一种方法来自动检测输入的名称是否是另一个名称的同义词。我希望自动完成功能能够处理 95% 的此类情况。随着表集大小的增加,“制作同义词”的需求将减少。希望能消除困惑。


更新:对于那些想知道我继续前进的人......我已经使用了第二个模式,但删除了item_namesanditem_synonyms表,希望Solr能够为我提供执行我需要的所有剩余任务的能力:

items: id | name | picture | price | description | picture

感谢大家的帮助!

4

3 回答 3

2

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

摘自 solr 功能列表:

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

用户查询的拼写建议

更多喜欢这个给定文档的建议

自动建议功能

性能优化

于 2011-01-12T22:04:51.327 回答
1

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

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

于 2011-01-06T19:11:26.510 回答
0

只是一个想法。

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

于 2011-01-04T06:48:23.697 回答