java - 如何识别从多个提要中收集的重复项并将其链接到数据库中

标签 java database jsp duplicate-data multiple-records

我有一个数据库,其中存储了从多个站点获取的产品的详细信息,并通过各个站点的api进行收集。当我调用feed时,这些详细信息存储在数据库表中。
我遇到的问题是,由于卖家在许多网站上列出了完全相同的产品,我的数据库中最终会有重复的项目,然后当我在网页上显示这些项目时,就会有许多重复的项目。
问题是,商品没有任何明显的唯一标识符,它有商品的特定细节(可能有很多),然后是卖家对商品的描述。
我希望项目显示一次,然后向用户提供项目在其他位置的详细信息。
在不减慢整个数据库速度的情况下,我如何识别传入的重复项?我又该如何从所有重复的广告中选择一个广告,然后存储广告显示在哪些其他网站上。
谢谢你的帮助。

最佳答案

问题是双重的,而且都是站在你这边的。当你知道如何处理这个问题时,把代码写进一个程序(Java或SQL将很容易)。我先给它们命名,然后确定解决方案。
出于某种未知的原因,您假设从多个站点收集产品描述不会收集同一产品。
您已经习惯了常见的和无意义的Id列,这在使用电子表格原型功能时是很好的;但是它远没有达到数据库或开发级别功能所需的程度。您的用户(或老板)自然希望从数据库获得数据库功能,但您没有提供任何功能。(不,它不需要模糊字符串逻辑或任何类型的魔术。)
解决方案
这是用于建模关系数据库的IDEF1X标准的浓缩版本;部分重新标识。
您需要从数据库的角度考虑,并考虑执行功能所需的数据库表,这意味着您不允许使用自动递增Id列。该列给出一个电子表格aRowId,但它并不表示表的内容或标识产品的列。
你不能简单地从另一个网站上窃取数据,你需要考虑你的网站对产品的要求。贵公司对产品的理解是什么,如何识别产品?
标识列的所有列和数据类型。
标识哪些列是必需的,哪些是可选的。
确定哪些是强标识符。例如ManufacturerModel;短的Product Name,而不是长的Description(或者对于您的公司,长的描述是一个标识符)。和你的用户一起工作,然后解决这个问题。
您会发现在Product周围实际上有一个小的表集群,例如ManufacturerProductType,也许Vendor,等等。
整理这些表格,并使其正常化,这样就不会重复数据。
一定要尊重这些标识符。选择唯一的。这些是候选密钥。每个表至少需要一个,并且Product中会有多个。将要搜索的所有标识符都需要编制索引(是否唯一)。请注意,唯一索引不能为空,因此不能选择可选列。
使Product的单个唯一标识符可能不是单个列。没关系,我们可以为数据库中的键计算多个列;它们称为复合键。
取最好的、最稳定的(不会改变的)唯一标识符作为候选键之一,并将其作为主键。
如果且仅当唯一标识符主键(可能是复合键)很长,因此不适合迁移到子表的主键,则添加代理项键。这将是Id列。请注意,这是一个附加列和附加索引。它不能替代候选密钥Product的标识符;它们不能被删除。
到目前为止,我们在你们公司的网站上有一个产品数据库,这对它很有意义。现在,我们可以对来自网络另一端的产品进行评估;当我们这样做时,我们这边有一个强大的框架,我们可以对照这个框架来衡量我们从网络另一端得到的垃圾。
喂养
您需要一个WebSite表来管理提要。
ProductWebSite之间将有一个关联表(多对多)。我们称之为ProductSite。它将只包含我们的ProductIdWebSiteCode. It may contain价格。内容对单个进纸循环有效。
将每个feed加载到一个临时数据库或模式中,一个传入的ProductIn表,可能每个源网站一个。这只是来自外部源的平面文件。添加一列IsValid并将默认值设置为true。
然后编写一些sql来比较ProductIn表及其松散和软盘内容,以及Product表及其强标识符。
我要做的是,几个单独的检查波,每一个都标记失败的行,IsValid为false。在最后将IsValid行插入我们的ProductSite中。
你可能很幸运,而且可以用一种乐观的态度来逃避。也就是说,只要在几个重要的列上找到匹配项,匹配就有效。(反转IsValid布尔值的默认值并进行更新)。
这是一个过程,需要一些来回的工作,直到它安定下来。这就是为什么你需要和你的用户一起工作。目标是不排除任何外部产品,但您的起点将排除许多外部产品。这将包括返回我们的Product表并改进标识符的内容(行中的值),以及用于标识匹配行的其他相关列。
对每个网站重复。
现在使用我们有信心的信息从Product表中填充我们的网站,并显示哪些网站有ProductSite中的产品可供销售。

关于java - 如何识别从多个提要中收集的重复项并将其链接到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4275954/

相关文章:

Java和openssl C不同的AES CTR加密结果

java - 您将如何在Java模型中表示出生日期?

java - 区分大小写的维吉尼亚密码产生错误的输出

android - 在 SQLite 中选择有限制的随机行

android - 使用 Room 数据库中的数据复制表

mysql - 数据库设计 : how to store XML/JSON in database?

javascript - 如何获取通过 servlet 中的 jquery 添加的动态填充列表的值

java - 仅重定向 HTML 页面一次

java - java jdk 1.7中的LinkedBlockingQueue

java - 使用 JSP 页面映射列表并在 Action 类中获取值。它将结果列表作为 Action 类中的笛卡尔积