gpt4 book ai didi

javascript - HTML5 应用数据库同步

转载 作者:太空狗 更新时间:2023-10-29 14:15:07 26 4
gpt4 key购买 nike

我目前正在从事一个涉及将数据存储在 HTML5 SQL-Lite 数据库中的项目。目前,我有如下架构(4 个表):

TransData:
-----------------------------------------------------------
| TID | UserName | TransColor | ... | Date | Note |
-----------------------------------------------------------
| 6 | Brendan | Red | ... | | |
-----------------------------------------------------------
| 7 | Brendan | Red | ... | | 1 |
-----------------------------------------------------------

FullData:
-----------------------------------------------------------
| TID | UserName | TransColor | ... | Date | Note |
-----------------------------------------------------------
| 1 | Brendan | Red | ... | | Start |
-----------------------------------------------------------
| ... | Brendan | Red | ... | | |
-----------------------------------------------------------
| 40 | Brendan | Red | ... | | End |
-----------------------------------------------------------

SalamanderData:
----------------------------------------------------
| SID | SalamanderName | Length | ... | TID |
----------------------------------------------------
| 1 | Northern-Slimy | 16 | ... | 6 |
----------------------------------------------------
| 2 | Two-Lined | 26 | ... | 6 |
----------------------------------------------------
| 3 | Two-Lined | 12 | ... | 7 |
----------------------------------------------------

SalamanderData:
----------------------------------------------------
| SID | SalamanderName | Length | ... | TID |
----------------------------------------------------
| 1 | Northern-Slimy | 16 | ... | 6 |
----------------------------------------------------
| 2 | Two-Lined | 26 | ... | 6 |
----------------------------------------------------
| 3 | Two-Lined | 12 | ... | 7 |
----------------------------------------------------

注意:TransData中的“注意”列用于指向FullData字段中集合的起始数据点。

我的应用程序和服务器之间的数据库不应该同步。我只是想将所有这些表转储到服务器上的数据库中(转储是指更新对其他表的引用,然后插入到服务器数据库中)。

我打算使用 MAX(TID-Server) + TID-App = new TID-Server,并将更新级联到表中。

你会怎么做?

最佳答案

来自 Dan Pichelman 的评论,问题是客户端将记录插入本地数据库,为此,必须为它们确定主键。但是,考虑到所有不同的客户端都在做同样的事情,新的 PK 在到达服务器时会发生冲突。

对于物理断开连接(至少有时)或不能存在单点故障的系统(例如在共享序列生成器中),这是一个常见问题。

一些常见的解决方案是:

GUID

这里的 PK 是一个 128 位(或更大)的随机数。任何两个 PK 相同的可能性极小。但为了进一步减少冲突的变化,GUID 算法包括使用唯一机器标识符(网络 MAC)和时间进行播种。在同一台机器上生成的两个 GUID 永远不会发生冲突,在具有不同 MAC 的机器上生成的 GUID 也不会发生冲突。大多数机器和语言都有生成 GUID 的 native 函数,但 JavaScript 没有。见:

分区命名方案

在这个方案中,PK 又是一个很大的数字(实际上是位域),并且您将其划分为分层方式。一个很好的例子是国际电话系统(至少在可移植号码之前)。这里电话号码分为:

  • 国家代码:例如美国 - 1
  • 区号:例如 Sunnyvale - 615
  • 订阅号,由交易所控制。

在您的情况下,您可以按以下方式划分数字:

  • 用户登录(例如每个用户唯一的号码)
  • session ID(例如,每个用户每次登录的唯一编号,用于区分同一用户在不同浏览器/计算机上的不同 session )
  • 序列号

将这三者结合起来,您将获得独一无二的 PK。

PK“许可”服务器

前两个建议的优点是它们可以完全断开连接。如果您有一个已连接的客户端,您可以有一个 Web 服务在客户端请求时提供 PK。

为了提高效率,它可能会返回一批,比如 100 个数字。这甚至可能在用户登录时返回。

客户可以全部使用它们并请求更多。可能存在客户端忘记状态并在全局 PK 序列中留下“漏洞”的情况。这几乎肯定不是问题。

一些注意事项

有时您可能喜欢顺序 PK 以用于表格排序。在哪种情况下,您需要按客户或创建时间订购?如果其中一个很重要,您可能会对分区命名方案给予更高的评价。视情况将客户端或时间作为第一个 分区。或者,向表中添加更多列。

如果您不想要分区命名方案的固定结构,GUID 会很好用。

如果您需要集中协调,请使用 PK 许可证服务器。

关于javascript - HTML5 应用数据库同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12266770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com