2009-04-22 169 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