如何识别从多个订阅源收集的重复项目并在数据库中链接到它们
我有一个数据库,存储从许多站点获取的产品的详细信息,并通过各个站点API收集。 当我调用feed时,详细信息存储在数据库表中。
我遇到的问题是,因为卖家在很多网站上列出完全相同的产品,我最终在我的数据库中有重复的项目,然后当我在网页上显示它们时,有很多重复项。
问题是该项目没有任何明显的唯一标识符,它具有项目的具体细节(其中可能有许多),然后是来自卖方的项目描述。
我希望项目能够显示一次,然后向用户提供项目列表的其他位置的详细信息。
如何在不降低整个数据库速度的情况下识别出来的重复项? 然后,我如何从所有重复项中选择一个广告,然后存储广告所显示的其他网站。
谢谢你的帮助。
问题是双重的,两者都在你身边。 当你弄清楚如何处理它时,将代码写入程序(Java或SQL将很容易)。 我先给他们起名,然后确定解决方案。
-
由于某些未知原因,您假设从多个站点收集产品说明不会收集相同的产品。
-
您习惯于常见且无意义的
Id
列,在使用电子表格原型function时这很好; 但它远不及数据库或开发级function所需的。 您的用户(或老板)自然希望数据库具有数据库function,而您没有提供任何数据库function。 (不,它不需要模糊字符串逻辑或任何类型的魔法。)
解
这是用于建模关系数据库的IDEF1X标准的精简版本; 部分是标识符。
-
您需要考虑数据库术语,并考虑执行函数所需的数据库表,这意味着您不能使用自动增量
Id
列。 该RowId
电子表格提供了RowId
,但它并不暗示表格的内容或标识产品的列。 -
而且你不能简单地从其他网站上删除数据,你需要考虑你的网站对产品的要求。 贵公司对产品有何了解,以及如何识别产品?
-
标识列的所有列和数据类型。
-
确定哪些列是必需的,哪些是可选的。
-
确定哪些是强标识符 。 例如。
Manufacturer
和Model
; 简短的Product Name
,而不是长Description
(或者可能是贵公司,长描述是标识符)。 与您的用户合作,并将其解决。 -
您会发现在
Product
周围实际上有一ProductType
表格,例如Manufacturer
,ProductType
,也许是Vendor
等。 -
组织这些表,并对它们进行规范化,这样就不会复制数据。
-
确保您对这些标识符有一点尊重。 选择哪一个是独一无二的。 那些是候选钥匙 。 每个表至少需要一个,并且
Product
中将有多个表。 将搜索的所有标识符都需要编入索引(唯一或不唯一)。 请注意,Unique Indices不能为Nullable,因此您无法选择可选列。 -
使产品的单个唯一标识符的用途可能不是单个列。 没关系,我们可以为数据库中的键评估多个列; 它们被称为复合键 。
-
采取最好,最稳定(一个不会改变的)唯一标识符,其中一个候选键,并使其成为主键 。
-
如果且仅当唯一标识符,主键(可能是复合键)非常长,因此不适合迁移到子表的主键,则添加 代理键 。 这将是
Id
专栏。 请注意,这是一个额外的列和附加索引。 它不能代替Product
标识符,即候选密钥; 他们无法删除。
到目前为止,我们在您的公司网站上有一个产品数据库,这对它很有意义。 现在我们可以评估网络另一端的产品; 当我们这样做时,我们有一个强大的框架,我们可以用它来衡量我们从网络另一端获得的垃圾。
饲料
-
您需要一个
WebSite
表来管理订阅源。 -
Product
和WebSite
之间将有一个关联表(多对多)。 我们称之为ProductSite
。 它将仅包含我们的ProductId
和WebSiteCode. It may contain
WebSiteCode. It may contain
Price`。 内容对单个Feed周期有效。 -
将每个订阅源加载到临时数据库或模式,传入的
ProductIn
表,可能是每个源网站一个。 这只是来自外部源的平面文件。 添加列IsValid
并将Default设置为true。 -
然后编写一些SQL,将
ProductIn
表与其松散和软盘内容进行比较,使用我们的Product
表及其强标识符。-
我这样做的方法是,几次单独检查,每次检查标记失败的行,
IsValid
为false。 最后将IsValid
行插入到ProductSite
。 -
你可能很幸运,并采取乐观的态度。 也就是说,只要您在几个重要列上找到匹配项,匹配就有效。 (反向默认并更新
IsValid
布尔值)。 -
这是一个需要一些来回工作的过程,直到它安定下来。 这就是为什么您需要与Indentifiers合作的用户。 目标是不排除任何外部产品,但您的出发点将排除许多产品。 这将包括返回我们的
Product
表并改进Identifiers的内容(行中的值)以及用于标识匹配行的其他相关列。
-
-
对每个WebSite重复上述步骤。
-
现在使用我们自信的信息从我们的
Product
表中填充我们的网站,并显示哪些网站有ProductSite
销售的产品。
我认为这不是代码或数据库问题。 你说:
问题是该项目没有任何明显的唯一标识符
在你要求计算机为你做这件事之前,你需要弄清楚那些独特之处。 听起来你需要某种模糊的字符串相似度算法。
您认为重复的数据的一些示例可能会有所帮助。