如何存储“购买此商品的客户”

时间:2011-01-14 04:56:47

标签: database-design amazon recommendation-engine

我正在构建像亚马逊的“购买此商品的客户”这样的功能。我有大约6年的订单来挖掘这些数据,显然会继续更新新订单的数据。

想到几个问题:

  1. 如何存储这些关系?我正在考虑一个带有productA,productB和count(或rank)的简单表。这够了吗?
  2. 我不认为旧数据与新数据一样重要。我如何确定新数据的优先顺序?
  3. 编辑:这个网站只销售一种产品,所以几乎所有东西都是相关的,不需要过滤。我也希望尽可能简单 - 数据已经在我的数据库中,我正在寻找最简单的计算和存储方法。

4 个答案:

答案 0 :(得分:1)

您可以使用easyrec完成任务。它将以下列格式存储关系:

CREATE TABLE `itemassoc` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `tenantId` int(11) NOT NULL DEFAULT '0',
  `itemFromId` int(11) NOT NULL DEFAULT '0',
  `itemFromTypeId` int(11) unsigned NOT NULL DEFAULT '0',
  `assocTypeId` int(11) unsigned NOT NULL DEFAULT '0',
  `assocValue` double NOT NULL DEFAULT '0',
  `itemToId` int(11) NOT NULL DEFAULT '0',
  `itemToTypeId` int(11) unsigned NOT NULL DEFAULT '0',
  `sourceTypeId` int(11) NOT NULL DEFAULT '0',
  `sourceInfo` varchar(250) DEFAULT '0',
  `viewTypeId` int(11) unsigned NOT NULL DEFAULT '0',
  `active` tinyint(1) NOT NULL DEFAULT '1',
  `changeDate` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_itemassoc` (`tenantId`,`itemFromId`,`itemFromTypeId`,`itemToId`,`itemToTypeId`,`assocTypeId`,`sourceTypeId`),
  KEY `idFrom_assoc` (`itemFromId`,`itemFromTypeId`,`assocTypeId`,`tenantId`),
  KEY `recommender` (`itemFromId`,`itemFromTypeId`,`itemToTypeId`,`assocTypeId`,`tenantId`,`active`)
) ENGINE=InnoDB AUTO_INCREMENT=38480 DEFAULT CHARSET=latin1 COMMENT='Table containing item associations'

基本上是

  1. 意达
  2. ASSOCTYPE(例如:BOUGHT_TOGETHER)
  3. ITEMB
  4. ASSOC VALUE(推荐力度)
  5. easyrec可以导入您的“购买行动”并从中计算出规则。

答案 1 :(得分:0)

查看http://taste.sourceforge.net/

  

味道灵活,快速   协同过滤引擎   Java的。引擎带用户'   物品的喜好(“品味”)和   返回估计的偏好   其他项目。例如,一个网站   销售书籍或CD可以轻松使用   尝试从过去中弄清楚   购买数据,CD是客户   可能有兴趣听。

Google还有一个可以根据您的用例量身定制的预测API。检查他们的scenarios here

答案 2 :(得分:0)

“我如何存储这些关系?我正在考虑一个包含productA,productB和count(或rank)的简单表。这是否足够?”

这还不够,真的。最好是使用对象的语义

所以让数据与对象相关联(就像一本书:它是一本书,由xxx编写,写作风格,书籍......),并查看与其他数据的关系,这些数据将您带到另一个对象(就像这种书是这种类型的,或者这个艺术家对这个艺术家,或两者,等等...)。这真的很难做到。

您可以选择自己做,但可能没有您想要的那么多。

我真的认为你应该看看已经存在的东西(例如在sourceforge或github上)。

答案 3 :(得分:0)

我个人不会存储这些数据。我会创建一个动态选择要建议的产品的视图。

一个简单的实现可能是:

  1. 选择也购买相同产品的代表人数(E.G. 1000)
  2. 根据这些用户,他们购买的前N个产品是什么。
  3. 向用户推荐这些产品。
  4. 您可以通过删除第2步来简化它,以便您只显示已购买的其他产品,而不受欢迎程度。

    正如Simon Marc所建议的那样,您可以通过按照标准过滤产品来使其更加复杂。

    对于较旧的数据,也许项目可以按日期或冗余标记使用,这意味着它们会从选择中过滤掉。