C# 数据库同步应用识别问题
C# database syncing application identification issue
我正在尝试在 C# 应用程序中同步 SQL 服务器和 SQLite(数据库结构匹配的位置)之间的数据。
该应用程序具有更新、添加、删除信息的能力,手持设备(摩托罗拉 rfidreader)也具有更新、添加、删除信息的能力,所以要么-要么可能已经更新了信息,应用程序直到同步开始。
我的问题是知道数据库中的哪一行已被 added/removed/ 或更新。我有一个历史记录 table 可以跟踪 CRUD 操作何时发生,但每个数据库中唯一的唯一标识符是一个自动递增的 ID 列。
问题是,如果我在手持设备上添加了一行,然后尝试同步这两个数据库,并在服务器上也添加了一行,ID 值(可能)将关闭。这意味着我无法搜索 ID 并期望该 ID 在 100% 的时间内都与两个数据库正确匹配。数据库之间不匹配的 ID 也会导致删除和更新功能失效,因为我不知道我是否正在处理正确的行项目。
如何同步这两个数据库并保持 ID 完整?
到目前为止我想出的唯一解决方案(而且我不认为它是最佳选择)是在服务器数据库中设置一个 table 以在同步时跟踪任何 ADDS。如此重要的是,有一个列影响了 table,HandheldRowID
和相应的 ServerRowID
- 所以我会连接到每个列,以防它们没有正确匹配
IF 您不能更改 PK 字段类型(如我的评论中所示,我建议您使用 uniqueidentifier
列)然后您(一如既往)有一个几个选项。我要先强调我最喜欢的。
为了保持参照完整性和自动递增 Id
字段,您应该使用 history
保存一个 state
table。然后在工作完成后在两个数据库之间开始 merge。手持设备应将其 history
table 发送到服务器,服务器应进行适当的更改并通知手持设备它需要的任何特定修改。
手持设备上的 history
table 示例:
Table Action Id
-----------------------
A Add 1502
A Edit 1502
A Delete 134
您服务器上的 table 相同:
Table Action Id
-----------------------
A Add 1502
A Delete 138
现在,你我都知道 table A
中的记录 1502
在两台设备上 不是同一条记录。那么我们告诉服务器什么?
那么,服务器应该简单地接收设备 history
table,然后枚举其中的每个操作。在 Add
上,它应该创建 它自己的 自动递增的 Id
值(在本例中为 1503
)。然后它将 添加 该记录到它的 history
table,新的 Id
。完成后,它将从客户端设备请求该记录的 实际数据 ,并将其保存到 table.
然后,服务器会看到相同 Id
的 Edit
记录并处理它。 (录制我们已经有最新版本的编辑没有意义。)
然后服务器会看到 Remove
记录,并从 它自己的 数据库中删除 Id
。然后它会在 history
table.
中添加一条记录
一旦完成所有这些(并将记录添加到服务器上的 history
table),它会发送它的副本 history
table 到手持设备,然后应用相同的更改。注意:掌上电脑应该回滚 它所做的更改到它可以做到的程度。 (如果存在 Add 1502
,则 Remove 1502
。)然后它会收到服务器的更改副本。一旦完成,它将做与服务器相同的事情,除了它不需要担心 Id
列上的 auto-incrementation,因为服务器处理了那个。
这个过程当然可以扩展(尽管更复杂)到拥有 多个 手持设备。
使用GUIDs/UniqueIdentifiers
如果你能用GUID
或uniqueidentifier
来PK,那么这个过程简直简单。只需 合并 更改即可。任何 GUID/uniqueidentifier
值重叠的可能性最小到 none。
我最喜欢的名言(来自维基百科文章):
They may or may not be generated from random (or pseudo-random) numbers. GUIDs generated from random numbers normally contain 6 fixed bits (these indicate that the GUID is random) and 122 random bits; the total number of unique such GUIDs is 2122 (approximately 5.3×1036). This number is so large that the probability of the same number being generated randomly twice is negligible; however other GUID versions have different uniqueness properties and probabilities, ranging from guaranteed uniqueness to likely duplicates. Assuming uniform probability for simplicity, the probability of one duplicate would be about 50% if every person on earth as of 2014 owned 600 million GUIDs.
GUID 参考:
Whosebug Question on Generation Algorithm
我正在尝试在 C# 应用程序中同步 SQL 服务器和 SQLite(数据库结构匹配的位置)之间的数据。
该应用程序具有更新、添加、删除信息的能力,手持设备(摩托罗拉 rfidreader)也具有更新、添加、删除信息的能力,所以要么-要么可能已经更新了信息,应用程序直到同步开始。
我的问题是知道数据库中的哪一行已被 added/removed/ 或更新。我有一个历史记录 table 可以跟踪 CRUD 操作何时发生,但每个数据库中唯一的唯一标识符是一个自动递增的 ID 列。
问题是,如果我在手持设备上添加了一行,然后尝试同步这两个数据库,并在服务器上也添加了一行,ID 值(可能)将关闭。这意味着我无法搜索 ID 并期望该 ID 在 100% 的时间内都与两个数据库正确匹配。数据库之间不匹配的 ID 也会导致删除和更新功能失效,因为我不知道我是否正在处理正确的行项目。
如何同步这两个数据库并保持 ID 完整?
到目前为止我想出的唯一解决方案(而且我不认为它是最佳选择)是在服务器数据库中设置一个 table 以在同步时跟踪任何 ADDS。如此重要的是,有一个列影响了 table,HandheldRowID
和相应的 ServerRowID
- 所以我会连接到每个列,以防它们没有正确匹配
IF 您不能更改 PK 字段类型(如我的评论中所示,我建议您使用 uniqueidentifier
列)然后您(一如既往)有一个几个选项。我要先强调我最喜欢的。
为了保持参照完整性和自动递增 Id
字段,您应该使用 history
保存一个 state
table。然后在工作完成后在两个数据库之间开始 merge。手持设备应将其 history
table 发送到服务器,服务器应进行适当的更改并通知手持设备它需要的任何特定修改。
手持设备上的 history
table 示例:
Table Action Id
-----------------------
A Add 1502
A Edit 1502
A Delete 134
您服务器上的 table 相同:
Table Action Id
-----------------------
A Add 1502
A Delete 138
现在,你我都知道 table A
中的记录 1502
在两台设备上 不是同一条记录。那么我们告诉服务器什么?
那么,服务器应该简单地接收设备 history
table,然后枚举其中的每个操作。在 Add
上,它应该创建 它自己的 自动递增的 Id
值(在本例中为 1503
)。然后它将 添加 该记录到它的 history
table,新的 Id
。完成后,它将从客户端设备请求该记录的 实际数据 ,并将其保存到 table.
然后,服务器会看到相同 Id
的 Edit
记录并处理它。 (录制我们已经有最新版本的编辑没有意义。)
然后服务器会看到 Remove
记录,并从 它自己的 数据库中删除 Id
。然后它会在 history
table.
一旦完成所有这些(并将记录添加到服务器上的 history
table),它会发送它的副本 history
table 到手持设备,然后应用相同的更改。注意:掌上电脑应该回滚 它所做的更改到它可以做到的程度。 (如果存在 Add 1502
,则 Remove 1502
。)然后它会收到服务器的更改副本。一旦完成,它将做与服务器相同的事情,除了它不需要担心 Id
列上的 auto-incrementation,因为服务器处理了那个。
这个过程当然可以扩展(尽管更复杂)到拥有 多个 手持设备。
使用GUIDs/UniqueIdentifiers
如果你能用GUID
或uniqueidentifier
来PK,那么这个过程简直简单。只需 合并 更改即可。任何 GUID/uniqueidentifier
值重叠的可能性最小到 none。
我最喜欢的名言(来自维基百科文章):
They may or may not be generated from random (or pseudo-random) numbers. GUIDs generated from random numbers normally contain 6 fixed bits (these indicate that the GUID is random) and 122 random bits; the total number of unique such GUIDs is 2122 (approximately 5.3×1036). This number is so large that the probability of the same number being generated randomly twice is negligible; however other GUID versions have different uniqueness properties and probabilities, ranging from guaranteed uniqueness to likely duplicates. Assuming uniform probability for simplicity, the probability of one duplicate would be about 50% if every person on earth as of 2014 owned 600 million GUIDs.
GUID 参考:
Whosebug Question on Generation Algorithm