HTML5 应用程序数据库同步

7

我目前正在从事一个涉及将数据存储在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中的“Note”列用于指向FullData字段中集合的起始数据点。
我的应用程序和服务器之间的数据库不应该同步。我仅仅是想将这些表中的所有内容转储到服务器上的数据库中(通过转储,我的意思是更新对其他表的引用,然后插入到服务器数据库中)。
我本来打算使用MAX(TID-Server) + TID-App = new TID-Server,并将更新级联到表格下方。
你会如何处理这个问题?

有人能帮忙吗?我无法想出如何编写一个插入查询,该查询首先会级联更新插入的项目。 - Brendan Lesniak
您显示了两次SalamanderData。如果我正确理解您的问题,您有4个“客户端”表,其表模式类似于“服务器端”。这些表不会同步,但偶尔需要将所有4个“客户端”表的内容发送到服务器,其中它们将根据需要进行更新或插入。最大的挑战是主键,这些主键当然不会同步(或更糟糕的是可能重复)。这是否接近您的问题? - Dan Pichelman
就是这样。是的,我不小心把我的SalamanderData表复制了两次;那应该是一个BugData表,显示各种昆虫(如蜈蚣和千足虫)的计数。我需要在插入时更新主键,以便它们与表和彼此同步。 - Brendan Lesniak
3个回答

6
根据Dan Pichelman的评论,问题在于客户端向本地数据库插入记录时需要确定它们的主键。但是,由于所有不同的客户端都执行相同操作,当它们到达服务器时,新的主键将会冲突。
这是在物理上断开连接(至少有时)或无法有单一故障点的系统中的常见问题,例如在共享序列生成器中。
一些常见的解决方案包括: GUID 在此方案中,PK是一个128位(或更大)的随机数。任何两个PK相同的可能性非常小。但为了进一步减少冲突的可能性,GUID算法包括使用唯一的机器标识符(网络MAC)和时间进行种子处理。在同一台计算机上生成的两个GUID永远不会发生冲突,不同MAC的计算机上生成的GUID也不会。大多数计算机和语言都有原生函数来生成GUID,但JavaScript没有。请参见: 分区命名方案 在此方案中,PK再次是一个大数字(实际上是位域),并且以分层方式进行分区。国际电话系统(至少在可携带号码之前)是一个很好的例子。在这里,电话号码被分成以下几个部分:
  • 国家代码:例如美国-1
  • 区号:例如Sunnyvale-615
  • 由交换机控制的用户号码。
在您的情况下,您可以通过以下方式对该数字进行分区:
  • 用户登录(例如每个用户唯一的数字)
  • 会话ID(例如每个用户登录的唯一数字,以区分同一用户但在不同浏览器/计算机上的不同会话)
  • 序列号
将所有三者组合起来,您将获得保证唯一的PK。 PK“许可”服务器 前两个建议的优点在于它们可以完全断开连接使用。如果您有一个连接的客户端,您可以在客户端请求时提供PK的Web服务。
为了提高效率,它可能会返回一批数字,例如100个。这甚至可以在用户登录时返回。
客户端可以使用它们并请求更多。可能会出现客户端忘记状态并在全局PK序列中留下“空洞”的情况。这几乎肯定不是问题。

一些注意事项

有时您可能希望使用顺序主键来进行表格排序。在这种情况下,您需要根据客户端或创建时间进行排序吗?如果其中任何一个很重要,那么您可能会更高地评价分区命名方案。将客户端或时间作为适当的第一个分区。或者,向您的表格添加更多列。

如果您不想使用分区命名方案的固定结构,则 GUID 将非常有效。

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


0

我不知道有什么美观的方法来完成这个任务,但我通过编写存储过程来“解决”了它:

第一张表很容易——根据需要更新或插入。如果进行插入操作,请获取新插入记录的主键,然后相应地处理依赖表(通常意味着使用新主键插入数据)。在关系中遍历时需要重复执行此步骤。对于4个表而言,这样做是可以的,但是如果是40个表,我会很讨厌。

在我的情况下,这很混乱,并且涉及到具有oldPK和newPK的临时查找表。

这也是一段相当冗长和繁琐的代码,它唯一可取的特点就是它能够正常工作。


0

这有点违背您的要求,如果完全不合适,请评论并我会删除它。但是您没有指定服务器/客户端不能在主键方面同步的任何特定原因(在我看来,这确实是问题所在)。

我还做出了一个假设(根据您的数据和问题),我们正在谈论一个具有用户创建内容(如日志)的Web应用程序,该内容偶尔会上传到服务器。

那么仅仅为了娱乐,您是否考虑使用由几个字段构建的主键?这样,您可以在本地数据库中进行自动增量,将数据转储到服务器上,并且不会与其他用户的数据冲突。 SalamanderData表的示例可能是:

CREATE TABLE SalamanderData
(
    SID int NOT NULL,
    SalamanderName varchar(255),
    Length int,
    ... ...,
    TID int NOT NULL,
    CONSTRAINT pk_SDataEntry PRIMARY KEY (SID,TID)
)

这将创建一个基于SID和TID的PK。

通读我的帖子并检查其他答案后,我意识到这就是Andrew所建议的,因此即使这有所帮助,您也应该真正接受他的答案。

保留答案可能是为了澄清解决方案并给出代码示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接