Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
序列化和反序列化SQL查询_Sql_Serialization_Embedded_Binary_Protocols - Fatal编程技术网

序列化和反序列化SQL查询

序列化和反序列化SQL查询,sql,serialization,embedded,binary,protocols,Sql,Serialization,Embedded,Binary,Protocols,我有一个嵌入式设备,它保存一个内部表的列表。我希望它将此表的状态与一些外部数据库同步,以便进行调试。也就是说,每当我向某个结构数组添加元素时,我都希望设备发出“INSERT-INTO…”命令 但是,我通过RS232串行电缆发送数据,这使得发送显式SQL的开销无法接受 因为我经常使用的SQL命令只有3种类型,所以我只能序列化这几种。即插入,删除,以及更新 我的总体想法是使用“压缩/序列化”SQL协议发送数据。我们不会直接将命令发送到SQL server,但会将命令发送到自定义序列化SQL serv

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

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

因为我经常使用的SQL命令只有3种类型,所以我只能序列化这几种。即
插入
删除
,以及
更新

我的总体想法是使用“压缩/序列化”SQL协议发送数据。我们不会直接将命令发送到SQL server,但会将命令发送到自定义序列化SQL server,我将编写:

  • 我们将为每个数据库更改简单操作(即插入、删除、更新)分配一个编号。唯一可用的可序列化SQL命令是
    插入x()
    从x中删除,其中id=y
    。我们只能更改
    x
    y
  • 首先,在服务器上创建所有必要的表一次。在服务器上保留一个哈希表,将每个表映射到一个数字。这可以在普通SQL中完成,因为这只执行一次
  • 然后为每个表分配一个数字,确保服务器知道这个数字
  • 最后,每当我们希望执行一个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 id][2 data to send][byte of 1][byte 2]
    

    将被翻译成

    [INSERT INTO id][2 data to send]
        [byte of 108][6 bytes string "chille"]
        [byte of 120][3 bytes "usa"]
    
    [DELETE id][2 data to send][byte of 1][byte 2]
    
    因为id定义为单字节整数

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


    有人有更好的想法吗?

    大多数数据库管理系统都是通过准备好的语句来实现这一点的。准备一条语句,例如insert,然后仅使用相关参数执行它。服务器(或客户端)为准备好的语句提供某种ID(通常是整数,有时是字符串),客户端库可以根据需要重新执行它


    你的一些想法需要改进——尤其是删除中的或不明显。此外,您还需要定义“要发送的N个数据”标识的是多行还是多个值,如果标识的是多行,如何标识该行中有多少值。

    您可能在这里进行过早的优化,尤其是考虑到这只是为了测试。我将使用普通SQL实现该功能,并查看它的性能


    然后考虑你需要改进的时间,并把你的利益和其他时间做比较。比如添加用户可能购买的功能。

    我使用的是RS232,伙计。我真的负担不起发送比目前多10倍的数据。更不用说用ASCII码发送了。拥有一个良好的调试环境和一个透明的窗口将减少75%的调试时间。大多数调试时间都浪费在添加printf以查看此类信息上。健壮的日志框架将不仅仅是一个小功能。不要低估维护自定义(你是说健壮吗?)日志框架的成本。我看到人们在日志和ORM层上花费了大量的工作,当他们的客户不满意时,他们会感到非常惊讶。但也许我老了,脾气暴躁了;)谢谢你的意见!1) 总是行数,我总是发送协议简洁性的所有值。2) 我只想根据唯一id进行更新/删除,如果是,则仅更新/删除或删除。我假设您不知道任何类似的现有实现/协议。谢谢