【发布时间】:2019-12-19 02:57:39
【问题描述】:
我有一个从多个供应商导入包含“人员”信息的 CSV 文件的过程。该过程必须从 CSV 中读取人员,并决定是否需要在数据库中插入或更新人员。
一个人实际上可以存在于不同供应商的 CSV 中——所以我不能只通过 ID 查找每个人(每个供应商的“人”都有不同的 ID)。因此,我必须通过查看以下内容来确定此人是否是数据库新手:
- 供应商 ID + VendorAssignedID(即正在处理的供应商 ID 及其唯一的个人 ID)
- 社会保障号
- 名字 + 姓氏 + 生日
如果找到匹配项,我需要使用供应商 CSV 中的任何更改信息更新此人。如果未找到匹配项,则需要插入此人。
每个 CSV 最多可包含 1000 人。必须对照数据库检查每个人,以查看他们是否需要插入或更新。如果数据库包含 10,000 多人,无论有没有 EF Core,这似乎都会非常缓慢(每个 CSV 可能有 10,000,000 次读取)。
我目前在项目中使用 EF Core,但在这个特定领域,似乎 EF Core 无法胜任这项任务。
我很好奇其他人是如何解决此类问题的?执行此类操作的最快选择是什么 - 一系列 MERGE 语句,使用 EF Core 调用的存储过程?
其他信息
根据一些答案,我想我会添加以下内容。
首先,CSV 文件采用不同的格式——不同的列名、不同的值类型(例如,一个供应商可能使用数字来标识性别,而另一个供应商可能使用字母)。
CSV 文件正在通过 .Net Core Web API 上传到服务器。 Controller/Action 解析 CSV 文件,将值转换为通用格式并创建一个包含数据的 Person 对象列表。
所以,实际上,比较的是每个Person 对象中的数据和数据库中的数据。
【问题讨论】:
-
你在这里有点像掉进了兔子洞。我在一家公司工作了 15 年,他们最初弄错了我的出生日期。几年后,我意识到并进行了更新。所以他们把它改成了另一个错误的日期。在某些但不是所有系统中。那些被传播给供应商。我的 DOB 现在是垃圾数据。而且,Falsehoods Programmers Believe About Names 还谈到了更多的死胡同。只是,知道你在这里要做什么。
-
相信我,我知道与尝试匹配人相关的陷阱——即使 SSN 也不是万无一失的。但是,有时您需要满足于不是最优的解决方案。
-
公平声明。 FWIW,因为会有几个字符串比较,无论你使用什么都会很慢。
-
同意!我可能应该在上面说明它,但我不认为会有任何“极快”的解决方案 - 我试图找到的是我的慢速选项中最快的。 :-)
-
P.S.我是开发人员,而不是 DBA,所以我绝不是 SQL 专家。可以从那些熟悉 SQL 的人那里获得一些指导,我的选择是什么
标签: sql-server entity-framework