HTML5应用程序数据库同步
HTML5 App Database Syncing
我目前正在进行一个项目,该项目涉及将数据存储在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的本机函数,但JavaScript没有。参见:
- 在JavaScript中创建GUID:UUID
- 在JavaScript中生成UUID时发生冲突
分区命名方案
在这个方案中,PK再次是一个大数字(实际上是位字段),并且您将其划分为分层方式。一个很好的例子是国际电话系统(至少在便携式电话之前)。这里的电话号码分为:
- 国家代码:例如美国-1
- 区号:例如森尼维尔-615
- 用户号码,由交换机控制
在您的情况下,您可以通过以下方式对号码进行分区:
- 用户登录(例如每个用户唯一的号码)
- 会话id(例如每个用户每个登录的唯一数字,用于区分同一用户但在不同浏览器/计算机上的不同会话)
- 序列号
将这三者结合起来,你将有一个保证的唯一PK。
PK"许可证"服务器
前两个建议的优点是它们完全不连贯。如果你有一个连接的客户端,可以有一个web服务,当客户端请求时提供PKs。
为了提高效率,它可能会返回一批,比如说100个数字。这甚至可能在用户登录时返回。
客户可以使用它们,并要求更多。可能存在客户端忘记状态并在全局PK序列中留下"洞"的情况。这几乎肯定不会是一个令人担忧的问题。
一些注意事项
有时,出于表格排序的目的,您可能希望使用顺序PKs。在这种情况下,您需要按客户订购还是按创建时间订购?如果其中任何一个都很重要,您可能会对分区命名方案给予更高的评价。将客户端或时间视情况设置为第一个分区。或者,向表中添加更多列。
如果您不想要分区命名方案的固定结构,GUID会很好地工作。
如果需要集中协调,请使用PK许可证服务器。
我不知道有什么美观的方法可以做到这一点,但我通过编写存储过程"解决"了它:
第一个表很容易更新或根据需要插入。如果进行插入,请获取新插入记录的主键,然后相应地处理从属表(这通常意味着使用新主键插入数据)。在处理人际关系时,根据需要重复。对于4张桌子,你应该可以,但我不愿意做40张。
在我的案例中,它很混乱,涉及到带有oldPK和newPK的临时查找表。
这也是一个相当长的&乏味的代码,其唯一可取之处在于它可以工作。
这有点违背您的要求,所以如果这完全不符合要求,请发表评论,我会将其删除。但您没有指定服务器/客户端无法同步主键的任何特定原因(在我看来,这确实是这里的问题)。
我还假设(根据您的数据和问题),我们谈论的是一个网络应用程序,其中包含用户创建的内容(如日志),偶尔会上传到服务器。
那么,就体育而言,你有没有考虑过使用由几个领域构建的主键?这样,您就可以在本地数据库中进行自动增量,将数据转储到服务器,这样就不会与其他用户的数据发生冲突。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的建议,所以即使这对你有帮助,你也应该真正接受他的答案
保留答案是为了可能澄清解决方案并给出代码示例
- HTML5应用程序数据库同步
- node.js和hapi:同步从数据库中获取数据
- 同步数据库请求节点JS ORM
- 如何将前端模型与后端数据库同步
- 同步 php 和 javascript 以在 SQL 数据库中发送数据
- 使用电话间隙的高级数据库同步
- 使用 ng-repeat同步数据库中请求的数据
- 需要同步 pouchDB 数据库的解决方案
- ajax 网页与数据库的同步
- 有没有一种干净的方法来混合异步和同步数据库查询处理
- 将本地数据库与电话间隙上的服务器同步
- 如何使表中已更改的项与数据库同步
- 同步与异步数据库访问
- 填充和添加选择选项并与数据库同步
- Node JS同步数据库调用
- 用于数据库的Jquery ajax同步调用
- Nodejs异步数据库功能需要同步应答
- React应用程序和Firebase数据库之间的同步状态
- 如何确保firebase在调用' process.exit() '之前同步所有数据库
- 本地存储-如何将Javascript对象与索引数据库同步