2012-09-04 174 views
7

我目前正在研究一個涉及將數據存儲在HTML5 SQL-Lite數據庫中的項目。目前,我有一個架構如下(表4):HTML5應用程序數據庫同步

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,並逐級下表的更新。

你會怎麼做呢?

+0

任何人都可以幫忙嗎?我無法弄清楚如何編寫一個插入查詢,它將首先將更新級聯到插入的項目。 – Brendan

+0

您顯示SalamanderData兩次。如果我正確理解你的問題,你有4個表格「客戶端」,表格模式類似於「服務器端」。這些表格不會也不會同步,但偶爾您需要將所有4個「客戶端」表格的內容發送到服務器,以便在適當的時候更新或插入表格。主要的挑戰是主鍵,它們當然不會同步(或者更糟的是可能會被重複)。這是關閉嗎? –

+0

就是這樣。是的,我意外地複製了我的SalamanderData表格兩次;這應該是一個BugData表,它顯示了諸如蜈蚣和千足蟲等各種錯誤的計數。我需要在插入時更新主鍵,以便將它們同步到表和對方。 – Brendan

回答

6

Dan Pichelman的評論,問題是,客戶端將記錄插入本地數據庫和,這樣做,有權決定他們的主鍵。但是,鑑於所有不同的客戶都在做同樣的事情,新的PK將在他們碰到服務器時發生衝突。

這是一個常見的問題是它們是物理上斷開(至少有時)或其中不能有故障的單點,例如在一個共享的序列發生器系統。

一些常見的解決方案是:

GUID

這裏PK是128位(或更大)的隨機數。任何兩個PK的機會相同的是極其小。但爲了進一步減少衝突的變化,GUID算法包括使用唯一的機器標識符(網絡MAC)和時間進行播種。在同一臺機器上生成的兩個GUID永遠不會發生衝突,在具有不同MAC的機器上也不會生成GUID。大多數機器和語言都有原生函數來生成GUID,但JavaScript不會。請參閱:

分區命名方案

在這個方案中,PK又是一個大的數字(位域真的),而你是劃分成分層的方式。國際電話系統就是一個很好的例子(至少在便攜式號碼之前)。這裏的電話號碼分爲:

  • 國家代碼:例如:在美國 - 1
  • 區號:如桑尼維爾 - 615
  • 用戶數,由交換控制。

在你的情況,你可能會劃分由數:

  • 用戶登錄
  • 會話ID(如一個唯一的號碼每一個用戶)(例如一個唯一的號碼每用戶每次登錄,同一用戶的不同會話之間,但在不同的瀏覽器/電腦)
  • 序列號

結合這三個你將有一個區來區分保證獨一無二的PK。

PK「許可證」服務器

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

爲了提高效率,它可能會返回一批,比如100個數字。這可能甚至會在用戶登錄時返回。

客戶端可以全部使用它們並請求更多。客戶可能會忘記狀態並在全球PK序列中留下一個「漏洞」。這幾乎肯定不是一個問題。

一些考慮

有時你可能會喜歡的表排序順序目的的PK。在這種情況下,您是否需要通過客戶或創作時間來訂購?如果其中任何一個都很重要,則可以將分區命名方案評分更高。根據需要將客戶端或時間作爲第一個分區。或者,向表中添加更多列。

如果您不想要分區命名方案的固定結構,那麼GUID將運行良好。

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

0

我不知道一個美觀的方式做到這一點,但我「解決」它通過編寫存儲過程:

第一張表是很容易 - 更新或根據需要插入。如果執行插入操作,則獲取新插入記錄的主鍵,然後相應地處理相關表(通常意味着使用新主鍵插入數據)。當你走過關係時,根據需要重複。對於4個表,你應該確定,但我討厭這樣做對40

對我來說,這是混亂和參與他們oldPK和newPK臨時查找表。

也有人的代碼,其唯一可取之處是,它是一個相當長&繁瑣位。

0

這會違反你的要求,所以只是評論,如果這是完全不符合要求,我會刪除它。但是你沒有具體說明爲什麼服務器/客戶端不能同步主鍵(這在我看來真的是這裏的問題)。

我也在假設(從你的數據和你的問題),我們正在談論一個帶有用戶創建內容(如日誌)的webapp,偶爾會上傳到服務器。

因此,僅僅爲了運動,你是否考慮過使用由幾個字段構建的主鍵?這樣,您可以在本地數據庫中自動增加數據,將數據轉儲到服務器,並且不會與其他用戶數據相沖突。 SalamanderData表的一個例子是:

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

然後哪個會創建一個PK出SID和TID。

讀通過我的文章和檢查其他的答案,我意識到,這是安德魯建議,因此,即使這可以幫助你,你應該接受他的回答

保持答案爲宗旨可能澄清的解決方案,並給出一個代碼示例

相關問題