如何识别从多个订阅源收集的重复项目并在数据库中链接到它们

我有一个数据库,存储从许多站点获取的产品的详细信息,并通过各个站点API收集。 当我调用feed时,详细信息存储在数据库表中。

我遇到的问题是,因为卖家在很多网站上列出完全相同的产品,我最终在我的数据库中有重复的项目,然后当我在网页上显示它们时,有很多重复项。

问题是该项目没有任何明显的唯一标识符,它具有项目的具体细节(其中可能有许多),然后是来自卖方的项目描述。

我希望项目能够显示一次,然后向用户提供项目列表的其他位置的详细信息。

如何在不降低整个数据库速度的情况下识别出来的重复项? 然后,我如何从所有重复项中选择一个广告,然后存储广告所显示的其他网站。

谢谢你的帮助。

问题是双重的,两者都在你身边。 当你弄清楚如何处理它时,将代码写入程序(Java或SQL将很容易)。 我先给他们起名,然后确定解决方案。

  1. 由于某些未知原因,您假设从多个站点收集产品说明不会收集相同的产品。

  2. 您习惯于常见且无意义的Id列,在使用电子表格原型function时这很好; 但它远不及数据库或开发级function所需的。 您的用户(或老板)自然希望数据库具有数据库function,而您没有提供任何数据库function。 (不,它不需要模糊字符串逻辑或任何类型的魔法。)

这是用于建模关系数据库的IDEF1X标准的精简版本; 部分是标识符。

  1. 您需要考虑数据库术语,并考虑执行函数所需的数据库表,这意味着您不能使用自动增量Id列。 该RowId电子表格提供了RowId ,但它并不暗示表格的内容或标识产品的列。

  2. 而且你不能简单地从其他网站上删除数据,你需要考虑你的网站对产品的要求。 贵公司对产品有何了解,以及如何识别产品?

  3. 标识列的所有列和数据类型。

  4. 确定哪些列是必需的,哪些是可选的。

  5. 确定哪些是强标识符 。 例如。 ManufacturerModel ; 简短的Product Name ,而不是长Description (或者可能是贵公司,长描述标识符)。 与您的用户合作,并将其解决。

  6. 您会发现在Product周围实际上有一ProductType表格,例如ManufacturerProductType ,也许是Vendor等。

  7. 组织这些表,并对它们进行规范化,这样就不会复制数据。

  8. 确保您对这些标识符有一点尊重。 选择哪一个是独一无二的。 那些是候选钥匙 。 每个表至少需要一个,并且Product中将有多个表。 将搜索的所有标识符都需要编入索引(唯一或不唯一)。 请注意,Unique Indices不能为Nullable,因此您无法选择可选列。

  9. 使产品的单个唯一标识符的用途可能不是单个列。 没关系,我们可以为数据库中的键评估多个列; 它们被称为复合键

  10. 采取最好,最稳定(一个不会改变的)唯一标识符,其中一个候选键,并使其成为主键

  11. 如果且仅当唯一标识符,主键(可能是复合键)非常长,因此不适合迁移到子表的主键,则添加 代理键 。 这将是Id专栏。 请注意,这是一个额外的列和附加索引。 它不能代替Product标识符,即候选密钥; 他们无法删除。

到目前为止,我们在您的公司网站上有一个产品数据库,这对它很有意义。 现在我们可以评估网络另一端的产品; 当我们这样做时,我们有一个强大的框架,我们可以用它来衡量我们从网络另一端获得的垃圾。

饲料

  1. 您需要一个WebSite表来管理订阅源。

  2. ProductWebSite之间将有一个关联表(多对多)。 我们称之为ProductSite 。 它将仅包含我们的ProductIdWebSiteCode. It may contain WebSiteCode. It may contain Price`。 内容对单个Feed周期有效。

  3. 将每个订阅源加载到临时数据库或模式,传入的ProductIn表,可能是每个源网站一个。 这只是来自外部源的平面文件。 添加列IsValid并将Default设置为true。

  4. 然后编写一些SQL,将ProductIn表与其松散和软盘内容进行比较,使用我们的Product表及其强标识符。

    • 我这样做的方法是,几次单独检查,每次检查标记失败的行, IsValid为false。 最后将IsValid行插入到ProductSite

    • 你可能很幸运,并采取乐观的态度。 也就是说,只要您在几个重要列上找到匹配项,匹配就有效。 (反向默认并更新IsValid布尔值)。

    • 这是一个需要一些来回工作的过程,直到它安定下来。 这就是为什么您需要与Indentifiers合作的用户。 目标是不排除任何外部产品,但您的出发点将排除许多产品。 这将包括返回我们的Product表并改进Identifiers的内容(行中的值)以及用于标识匹配行的其他相关列。

  5. 对每个WebSite重复上述步骤。

  6. 现在使用我们自信的信息从我们的Product表中填充我们的网站,并显示哪些网站有ProductSite销售的产品。

我认为这不是代码或数据库问题。 你说:

问题是该项目没有任何明显的唯一标识符

在你要求计算机为你做这件事之前,你需要弄清楚那些独特之处。 听起来你需要某种模糊的字符串相似度算法。

您认为重复的数据的一些示例可能会有所帮助。

Interesting Posts