1

在多个客户端和服务器环境中拥有分布式、非始终连接的数据库的最佳方式是什么?

我正在构建一个多租户 Web 应用程序,它也有一个分离的 Windows 客户端。系统中的实体包括联系人、任务、活动等。这些实体中有很多是在客户端创建的,而与服务器断开连接。如果客户端以独立模式(当前版本)运行,它可能永远不会连接到服务器。

现在我想确保在客户端创建实体时,它不会在服务器端产生冲突。这似乎是使用 GUID 作为主键的完美工作,虽然在实体数量可能很少的客户端不是问题,但我担心这可能会成为服务器端的问题GUID 的随机性会使查找效率非常低。

此外,在什么时候(即哪个表)您不再需要在主键上使用 GUID - 例如说一个任务有一系列注释(1:N) - 注释没有什么特别特别的,它们只需要可访问 - 是否有一种有效的方法来键入这些实体?

4

3 回答 3

3

当您使用 GUID 时,性能影响不会出现在查找中,只有在将新数据插入索引时才会出现。这还取决于您的 dbms 如何处理 GUID 值。

无论如何,我建议使用 GUID,至少作为传输 ID。

于 2012-10-12T18:08:36.320 回答
1

现在我想确保在客户端创建实体时,它不会在服务器端产生冲突。这似乎是使用 GUID 作为主键的完美工作

GUID 将保证每一行都是唯一的。但唯一的行通常不是真正的问题。

如果租户是公司,则公司的身份证号码将出现在每一行中。如果来自同一公司的两个用户可以插入仅在 GUID 中不同的行,您仍然必须处理潜在的冲突。

例如,假设一家公司有两个用户在状态表中输入数据。

              guid    employer_id  state_code  state_name
              --
user1 enters  guid-1  12345        AL          Alabama
user2 enters  guid-2  12345        AL          Alabama

数据完整性需要更多的约束,而不仅仅是GUID 列上的主键约束。(特别是如果断开连接的客户端正在通过外键引用相关的其他表中输入数据。)

You don't want the GUID to be a clustered key. Some dbms will by default make a primary key the clustered key. If your dbms does that, it probably has a way to tell it not to, maybe by a declaration like your_column_name guid primary key nonclustered.

于 2012-10-16T15:00:37.630 回答
-2

好的。可以肯定的是,当您说客户创建它们时,我假设您并不是真的指“实体”。我猜你的意思是现有表中的行。如果那不是真的,请大声喊叫。

无论如何,这里的问题是唯一命名。对于您的情况,请在所有行前面加上用户 ID。只要用户是唯一的,记录就不会发生冲突。

您现在剩下的问题是记录是否会发生冲突。这通常不是一个可以自动解决的问题,并且可能超出了问题的范围。

于 2012-10-12T07:59:27.277 回答