将规范化数据库中的最新更改同步到 Salesforce?

Sync latest changes in a normalized database to Salesforce?

我们有一个业务要求,要在 Salesforce 中保持客户存储库的最新状态,为此我们决定实施一个小的休息 API 返回 JSON 能够被缓存和分页,每天查询一次。

目前的计划是调用 SQL 服务器内的存储过程,以调用自定义视图。

然而,返回所有结果对于同时用作 JSON、翻页等来说效率非常低

幸运的是,数据库中的所有相关行都有一个 LastUpdated 时间戳,不幸的是它已经很好地规范化了,所以现在我发现自己可以在类似 max 的函数中合并超过 15 个表的 LastUpdated 日期,在 SQL 中以空安全方式执行起来似乎相当复杂。

我可能实际上不需要 Salesforce 中的 LastUpdated 数据,这让我想知道,在各种嵌套查询中 Take the max of 15 LastModified columns 还是将它们全部与许多不同位置的输入日期进行比较会更好子句,并以某种方式将它们全部连接回根对象(本例中为学生)。

例如对于 3 个表的 简单 示例(忽略我的现实世界查询已经有几个我几乎不理解的子查询的事实,(实际上学生有 1 个或多个监护人,监护人有 1 个或多个phone 个不同类型)

Student
-------------------------------------------------------------------------
StudentID   |   Student   |   SchoolID   |   GuardianID   | LastModified



Guardian
-------------------------------------------------------------------------
GuardianID   |   Name   |   Phone   |   LastModified



School
-------------------------------------------------------------------------
SchoolID   |   Name   |   Phone   |   LastModified

最终得到一个可以导出的视图

View
--------------------------------------------------------------------------------------------------------------------
StudentID   |   Student   |   SchoolName   |   SchoolPhone   |   GuardianName   |   GuardianPhone   |   LastModified

其中 LastModified 是所有 3 个表中最新的,或者视图中的所有条目不知何故都是最近的更改,可能使用 rowversions?

你可能想重新考虑一下。如果“没关系,交付”来自管理层 - 以书面形式支付您的 a$$。如果性能是一个问题,最坏的情况是您可以将视图的结果加载到某个临时 table 并提供它,对吗?即使需要 5 分钟 运行 - 只要数据在 SF 预定呼叫到来时准备就绪,就应该没问题。 (SF开发者可以使用CRON表达式来调度它,你可以相应地规划)

排名不分先后...

我担心即使您设法取消此视图,它对 Salesforce 也毫无用处。将 15 比 1 反规范化为 1 个平面 table 让您想知道 SF 中的数据质量。

以前有人这样做过吗?数据是手动输入到 SF 还是有一些数据迁移,您可以重复使用 ETL 过程?

您在 SF 中的数据模型可能包含多个 table,也包括多对多关系(ERD, bit messy). Out of the box you have Account and Contacts and they can be related directly (by Contact.AccountId foreign key) and indirectly (by AccountContactRelation many-to-many table). Out of the box Contact 有 5 个 phone 字段(助理Phone, Fax、HomePhone、MobilePhone、OtherPhone、Phone)。他们可能已经将这些用于监护人,或者他们可能已经走了(相当新的)ContactPoint 路线并且确实有一个相关的 table 与您需要的任何 phone 和地址。

然后您的公司可能添加了自定义 table 字段,或者决定完全脱离标准 table 对其进行建模。至少他们可以向您展示 Setup -> Schema Builder 中的一些图表以帮助匹配内容。

如果有多个 tables - 理想情况下,每个人都会有 1 个或多个标记为“外部 ID”的字段(在您这边是唯一的)

另一个考虑因素是大小。每天发生多少变化?如果 SF 自定义代码将请求 JSON 并接收到一些东西(连同局部变量)将使它超过 6 MB RAM limit,那可能会很有趣。 (开发人员可以使用夜间批处理作业将其增加到 12,但仍然如此)。您将如何跟踪错误?如果集成出现故障并且您需要重新运行 1 个月的数据 - godspeed?

你甚至可以让服务从外面可见吗?它不能只在您的本地公司网络上,它必须是可从 Internet 访问的端点。你将如何保护它(也许是共享证书?),你会把所有 SF 数据中心 IP 列入白名单吗......如果不是 - 你可能必须推送到 SF 而不是 SF 拉它。

至于你还能怎么做...Integration Patterns doc (html or pdf). Part of it is knowing what to google for and whether you already have some ETL tools. BizTalk? Informatica? Mulesoft? Azure Data Factory? Hell, there's a paid SQL Server plugin 中很好地描述了推与拉技术,它隐藏了作为链接数据库的麻烦,据我记得你使用存储过程并且它们抽象SFAPI呼唤而去。如果您没有这些但仍想推送 - Salesforce“Data Loader”和“sfdx”开发人员实用程序可以从命令行 运行 和更新插入(有点像 MS SQL 合并语句)数据.您可以安排它们,将它们包装在一些简单的实用程序脚本中,使用 SF API 库。NET/PHP/Java/Python/what 有没有...有很多方法可以给这只猫剥皮。

如果您使用 Swagger 公开 JSON 服务,甚至还有一种名为“external services". And if you can produce OData compatible service there's something called Lightning Connect 的无代码方式来实现实时访问(并且您对 OData 的实施决定了您的能力有多大给出 tables,只读或 CRUD,是否搜索...)