2009-04-22 166 views
0

我有一個嵌入式設備,它保留了內部表的列表。我希望它將此表的狀態與某些外部數據庫同步用於調試目的。這就是每當我添加一個元素到某個結構數組時,我希望設備發出一個「INSERT INTO ...」命令。序列化和反序列化SQL查詢

但是,我通過RS232串行電纜發送數據,這使得發送顯式SQL的開銷不可接受。

由於我只使用了3種類型的SQL命令,因此我只能序列化這幾個。即INSERT INTO,DELETE FROMUPDATE

我想到的一般想法是用「壓縮/可序列化」SQL協議發送數據。我們不會發送命令直接到SQL服務器,而是一個自定義的序列化,SQL服務器,我會寫:

  1. 我們將電話號碼指定給每個數據庫,改變簡單的動作(即INSERT,DELETE,UPDATE) 。唯一可用的可串行化SQL命令是INSERT INTO x(),DELETE FROM x WHERE id=y。我們只能在那裏改變xy
  2. 首先在服務器上創建所有必要的表格一次。在將每個表映射到一個數字的服務器上保留一個散列表。這可以在普通的SQL中完成,因爲這隻能執行一次。
  3. 然後爲每個表分配一個數字,確保服務器知道這個數字
  4. 最後,無論我們希望執行SQL命令,我們都會發送命令號,然後是表號,然後是數據長度,然後是數據。服務器會根據表格的描述找出實際數據的佈局。

例如

INSERT INTO temperature(temperature,location) 
    VALUES ((108,"chille"),(120,"usa")) 

將被轉換爲

[INSERT INTO id][2 data to send] 
    [byte of 108][6 bytes string "chille"] 
    [byte of 120][3 bytes "usa"] 

DELETE FROM people (id,"bob") WHERE id=1 or id=2 

將被轉換爲

[DELETE id][2 data to send][byte of 1][byte 2] 

由於id被定義爲單字節整數。

這種精神是否有任何已知的協議/實現?

有沒有人有更好的主意?

回答

0

大多數DBMS使用預處理語句執行此操作。您準備一個語句,例如插入,然後僅使用相關參數執行它。服務器(或客戶端)爲預處理語句提供某種類型的ID(通常是一個整數,有時是一個字符串),客戶端庫可以根據需要重新執行它。

您的一些想法需要細化 - 特別是DELETE中的OR並不明顯。此外,您需要定義您的'要發送的N個數據'是否標識了多行或多個值,如果是多行,您如何標識該行中有多少個值。

+0

感謝您的意見! 1)總是行數,我總是發送所有值的協議的簡潔。 2)我想根據唯一ID更新/刪除,如果是這樣,只有OR有意義。 我假設你不知道任何類似的現有實現/協議。謝謝 – 2009-04-22 12:55:08

0

你可能會在這裏做過早的優化,特別是考慮到這只是爲了測試。我會使用普通SQL實現該功能並查看它的執行情況。

然後考慮您需要改進的時間量,並將這些好處與您在當時可以做的其他事情進行比較。就像添加用戶可能購買的功能一樣。

+0

我在一個RS232,夥計。即使發送比目前數據多10倍的數據,我也承擔不起。更不用說用ASCII發送它了。 擁有一個體面的調試環境和一個透明的窗口將會像調試時間的75%一樣中斷。大部分調試時間在添加printf來查看這些信息時被浪費了。健壯的日誌記錄框架將比一個小功能更有幫助。 – 2009-04-22 12:51:41