使用MS Sync Framework 2.0,我如何才能最好地处理相关表?

时间:2010-02-18 14:46:16

标签: c# .net synchronization microsoft-sync-framework

Sync Framework在逐个表的基础上同步数据,但我的实体在多组相关的父子表中进行了规范化。这会给我的应用程序带来问题,其中父行可能出现在要处理的服务器上,但子行可能不​​会出现几秒钟。如果我的客户端应用程序与服务器之间存在连接问题,则子行可能不​​会出现一段时间。

如何设计我的应用程序来处理与父表分开同步的子表?

我正在研究的具体方案是从后端系统接收服务器上的工作订单,以便使用平板电脑或PDA分发给现场工程师。这些工单是大型复杂的实体,可能涵盖了6个表。工程师完成工作,同步结果,服务器将完成的工单返回到后端系统。

到目前为止,我自己的一些想法发布在下面。

6 个答案:

答案 0 :(得分:2)

使用Sync Framework,将相关表添加到自己的同步组中。例如。将OrderHeader和OrderDetail表添加到他们自己的名为Orders的同步组中。

除非直接相关,否则不要在同步组中放置任何其他内容。

然后同步事务中的每个同步组。这样你就可以保证同时获得两个或没有同步的表......

请询问您是否需要有关此流程的更多详细信息。

答案 1 :(得分:0)

我可以自定义Sync Framework以使其尊重数据库关系。当自定义SyncAdapter遇到包含更改的行时,它可以遍历数据库模式中的子关系以获取相关行中的任何更改。这些更改都将添加到同一数据集中,并作为单个事务同步。

优点:

  • 从数据完整性的角度来看,这似乎是最好的解决方案。我可以确定某个特定实体包含来自客户端的所有可用更改,或者不包含任何更改。
  • 我不需要更改我的实体或以任何特殊方式将它们描述为自定义适配器 - 它可以为我已有的数据库关系派生所需的所有信息。
  • 我不需要对我的数据库模式做任何特别的事情 - 我几乎可以将我的代码指向任何数据库,它只会起作用。

缺点:

  • 以这种方式自定义Sync Framework可能需要大量工作,并且需要详细了解框架的内部结构。
  • 自定义适配器需要检测和处理循环数据库关系。

答案 2 :(得分:0)

设计应用程序,以便数据在不同时间出现无关紧要。该应用程序将显示或操作当时可用的任何数据。如果稍后显示更多数据,它也会显示。

优点:

  • 这可能是一种灵活而强大的数据处理方式,并不依赖于大量复杂的同步代码。

缺点:

  • 如果用户认为他们正在查看完整的任务,工单或其他任何内容,可能会让用户感到困惑,但稍后会出现额外的内容。
  • 如果数据从用户同步到服务器以发送到某个其他后端系统,则该系统可能不支持部分提交。

答案 3 :(得分:0)

校验和有什么用?每次应用程序对实体进行更改时,它都会根据实体的最新内容计算哈希值并将其保存在父行中。当应用程序读取实体时,它可以重新计算哈希值。如果这是当时可用的数据不匹配存储与实体散列,应用程序就知道,有更多的同步工作要做。

优点:

  • 可能是对应用程序域模型的一个相当直接的更改,不涉及更改Sync Framework的内部。

缺点:

  • 每次进行更改时,应用程序都需要将与实体相关的所有行读入内存。
  • 如果应用程序必须支持来自多个客户端的同一实体的更新,这将变得更加复杂。
  • 需要仔细规划在每个方向上同步哪些更改以及何时计算相应的哈希值。根据您的数据,您可能需要多次同步相同的表。
  • 定制一个申请;你不能使用相同的代码并将其应用于其他东西。

答案 4 :(得分:0)

反规范化一切。创建一个数据库视图,将相关表展平为单个连接结果集,或者只将数据存储在一个大表中。配置Sync Framework以同步该一个表,通过视图中的“最左侧”键对其进行批处理,该键应该是层次结构中根表的主键。客户端上的每个事务现在都包含对单个实体所做的所有更改。

优点:

  • 可以完全在数据库中实现。
  • 无需替换Sync Framework的任何部分。
  • 只要您仔细考虑如何构建和过滤视图,以及如何对基础表进行索引,就可以很好地扩展到大量行。

缺点:

  • 抛弃数据库规范化可能被认为是错误的。
  • 可能无法很好地扩展到大量的表和列,需要大量的连接。
  • 也必须汇总更改跟踪数据。
  • 如果使用视图,则必须创建触发器以使其可更新。

答案 5 :(得分:0)

我的想法在评论框内没有足够的空间:

同步主实体而不是关系数据? 我不知道我们是否可以使用Sync Framework执行此操作...可能实现自定义提供程序?

交易仍然存在问题。我们采取一个愚蠢的样本,你有帐户,每个帐户都是主要实体。

数据库A

BeginTransaction
    Substract $500 from account 1
    Add $200 to account 2
    Add $300 to account 3
EndTransaction

数据库B

BeginTransaction
    Substract $100 from account 1
    Add $100 to account 4
EndTransaction

同步时,您将检测到1上的冲突,但不会发现2,3和4上的冲突。通过此示例,您可以详细说明合并策略,但情况并非总是如此。