[英]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仍然是一個很大的數字(實際上是位域),您將其划分為分層的方式。 一個很好的例子是國際電話系統(至少在攜帶電話號碼之前)。 這里的電話號碼分為:
對於您的情況,可以通過以下方式對數字進行分區:
結合所有這三個,您將擁有一個保證唯一的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.