1

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

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

由于我经常使用的 SQL 命令只有 3 种,所以我只能序列化这几种。即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 被定义为单字节整数。

本着这种精神,是否有任何已知的协议/实现?

有没有人有更好的主意?

4

2 回答 2

0

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

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

于 2009-04-22T06:13:58.507 回答
0

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

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

于 2009-04-22T07:38:57.757 回答