序列化和反序列化SQL查询

时间:2009-04-22 05:51:12

标签: sql serialization embedded binary protocols

我有一个嵌入式设备,它保存了内部表的列表。我希望它将此表的状态与某些外部数据库同步以进行调试。这就是每当我向某个结构数组添加一个元素时,我希望设备发出“INSERT INTO ...”命令。

但是我通过RS232串行电缆发送数据,这使得发送显式SQL的开销无法接受。

由于我只使用了很多类型的SQL命令,所以我只能序列化这些命令。即INSERT INTODELETE FROMUPDATE

我想到的一般想法是使用“压缩/可序列化”SQL协议发送数据。我们不会将命令直接发送到SQL服务器,而是发送到我将编写的自定义序列化SQL服务器:

  1. 我们将为每个更改数据库的简单操作(即INSERT,DELETE,UPDATE)分配一个编号。唯一可用的可序列化SQL命令是INSERT INTO x ()DELETE FROM x WHERE id=y。我们只能更改xy
  2. 首先在服务器上创建一次所有必需的表。在服务器上保留一个哈希表,将每个表映射到一个数字。这可以在纯SQL中完成,因为这只能执行一次。
  3. 然后为每个表分配一个编号,确保服务器知道此编号
  4. 最后,每当我们希望执行SQL命令时,我们将发送命令编号,后跟表编号,后跟数据长度,后跟数据。服务器将根据表的描述确定实际数据的布局。
  5. 例如

    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被定义为单字节整数。

    这种精神是否有任何已知的协议/实施?

    有没有人有更好的主意?

2 个答案:

答案 0 :(得分:0)

大多数DBMS使用预准备语句执行此操作。您准备一个语句(如插入),然后仅使用相关参数执行它。服务器(或客户端)为预准备语句提供某种ID(通常是整数,有时是字符串),客户端库可以根据需要重新执行它。

您的一些想法需要改进 - 特别是DELETE中的OR并不明显。此外,您需要定义“要发送的N个数据”是否标识了多个行或多个值,如果有多个行,您如何识别行中有多少个值。

答案 1 :(得分:0)

您可能在这里进行过早优化,特别是考虑到这只是用于测试。我将使用纯SQL实现该功能,并了解它的执行情况。

然后考虑您需要改进它的时间,并将这些好处与您在那段时间可以做的其他事情进行比较。就像添加用户可能购买的功能一样。