簡體   English   中英

HTML5 App數據庫同步

[英]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的評論,問題在於客戶端將記錄插入到本地DB中,並且這樣做必須為它們確定主鍵。 但是,由於所有不同的客戶端都在執行相同的操作,因此新的PK在到達服務器時會發生沖突。

這是在物理上斷開連接(至少有時是斷開連接)或無法出現單點故障(例如在共享序列生成器中)的系統的常見問題。

一些常見的解決方案是:

圖形用戶界面

此處PK是128位(或更大)的隨機數。 任何兩個PK相同的機會非常小。 但是為了進一步減少沖突的變化,GUID算法包括使用唯一的機器標識符(網絡MAC)和時間進行播種。 在同一台計算機上生成的兩個GUID永遠不會沖突,在具有不同MAC的計算機上生成的GUID也不會沖突。 大多數機器和語言都具有生成GUID的本機功能,但是JavaScript沒有。 看到:

分區命名方案

在此方案中,PK仍然是一個很大的數字(實際上是位域),您將其划分為分層的方式。 一個很好的例子是國際電話系統(至少在攜帶電話號碼之前)。 這里的電話號碼分為:

  • 國家/地區代碼:例如,美國-1
  • 區號:例如,桑尼維爾-615
  • 訂戶號,由交易所控制。

對於您的情況,可以通過以下方式對數字進行分區:

  • 用戶登錄名(例如,每個用戶唯一的號碼)
  • 會話ID(例如,每個用戶每次登錄的唯一編號,以區分同一用戶但在不同瀏覽器/計算機上的不同會話)
  • 序列號

結合所有這三個,您將擁有一個保證唯一的PK。

PK“許可證”服務器

前兩個建議的優點是它們的工作完全斷開。 如果您有連接的客戶端,則可以有一個在客戶端請求PK時提​​供PK的Web服務。

為了提高效率,它可能會返回一批(例如100個)數字。 用戶登錄時,甚至可能返回此值。

客戶可以全部使用它們,並要求更多。 在某些情況下,客戶端會忘記狀態並在全局PK序列中留下“漏洞”。 這幾乎肯定不是問題。

一些注意事項

有時,您可能希望順序PK用於表排序。 在這種情況下,您需要按客戶還是按創建時間訂購? 如果其中之一很重要,則可以對分區命名方案進行更高的評分。 將客戶端或時間作為適當的第一個分區。 或者,將更多列添加到表中。

如果您不希望使用分區命名方案的固定結構,則GUID可以很好地工作。

如果要集中協調,請使用PK許可證服務器。

我不知道從美學上令人愉悅的方式來執行此操作,但是我通過編寫存儲過程來“解決”它:

第一個表很簡單-根據需要更新或插入。 如果進行插入,請獲取新插入記錄的主鍵,然后相應地處理從屬表(這通常意味着使用新的主鍵插入數據)。 遍歷關系時,根據需要重復。 對於4張桌子,您應該還可以,但是我不願意花40張桌子。

就我而言,這很麻煩,並且涉及到臨時查詢表,其中包含oldPK和newPK。

這也是相當冗長而乏味的代碼,其唯一的贖回功能是可以正常工作。

這有點違反您的要求,因此請評論一下,如果這完全不合時宜,我將其刪除。 但是您沒有指定任何特定原因來說明服務器/客戶端為何無法與主鍵同步(我認為這實際上是這里的問題)。

我還假設(根據您的數據和您的問題)我們正在談論一個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。

通讀我的帖子並檢查其他答案,我意識到這是安德魯建議的,因此即使這對您有所幫助,您也應該接受他的答案

保留答案,以便可能闡明解決方案並給出代碼示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM