考虑一个具有多个商店的电子商务应用程序。每个店主都可以编辑其商店的商品目录。
我当前的数据库架构如下:
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
description
picture
items
common
我认为这个模式的好处是:
优化查找&处理同义词:可以使用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_names
和item_synonyms
作为我可以查询的实用程序表)
- 您会建议更好的架构吗?
- 是否应该为自动完成标准化项目名称?这可能是 Facebook 为“学校”、“城市”条目所做的吗?
- 第一个模式还是第二个模式更好/最适合搜索?
提前致谢!
参考文献: (1)规范一个人的名字是否太过分了?, (2)避免 DISTINCT
编辑:如果输入了 2 个具有相似名称的项目,看到此内容的管理员只需单击“制作同义词”,这会将其中一个名称转换为另一个名称的同义词。我不需要一种方法来自动检测输入的名称是否是另一个名称的同义词。我希望自动完成功能能够处理 95% 的此类情况。随着表集大小的增加,“制作同义词”的需求将减少。希望能消除困惑。
更新:对于那些想知道我继续前进的人......我已经使用了第二个模式,但删除了item_names
anditem_synonyms
表,希望Solr能够为我提供执行我需要的所有剩余任务的能力:
items: id | name | picture | price | description | picture
感谢大家的帮助!