1

内部テーブルのリストを保持する組み込みデバイスがあります。デバッグの目的で、このテーブルの状態を外部データベースと同期させたいと思います。つまり、特定の構造体配列に要素を追加するときはいつでも、デバイスに「INSERTINTO...」コマンドを発行させたいのです。

ただし、RS232シリアルケーブルを介してデータを送信しているため、明示的なSQLを送信するオーバーヘッドは許容できません。

私がよく使うSQLコマンドは3種類しかないので、シリアル化できるのはこれらのいくつかだけです。つまりINSERT INTO、、、DELETE FROMおよびUPDATE

私が念頭に置いていた一般的な考え方は、「圧縮/シリアル化可能な」SQLプロトコルを使用してデータを送信することです。コマンドをSQLサーバーに直接送信するのではなく、カスタムのシリアル化されたSQLサーバーに送信します。

  1. データベースを変更する単純なアクション(つまり、INSERT、DELETE、UPDATE)ごとに番号を割り当てます。使用可能なシリアル化可能なSQLコマンドは、、のみINSERT INTO x ()ですDELETE FROM x WHERE id=y。変更できるのはxy
  2. 最初に、サーバー上に必要なすべてのテーブルを一度作成します。各テーブルを数値にマップするハッシュテーブルをサーバー上に保持します。これは1回だけ実行されるため、プレーン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は1バイト整数として定義されているため。

この精神で既知のプロトコル/実装はありますか?

誰かもっと良いアイデアがありますか?

4

2 に答える 2

0

特にこれがテストのためだけであることを考えると、ここで時期尚早の最適化を行っている可能性があります。プレーンSQLを使用して機能を実装し、そのパフォーマンスを確認します。

次に、それを改善するために必要な時間を検討し、その間にできる他のことと利点を比較します。ユーザーが購入する可能性のある機能を追加するようなものです。

于 2009-04-22T07:38:57.757 に答える
0

ほとんどの DBMS は、準備済みステートメントを使用してこれを行います。挿入などのステートメントを準備し、関連するパラメーターのみを指定して実行します。サーバー (またはクライアント) は、準備されたステートメントに何らかの ID (通常は整数、場合によっては文字列) を与え、クライアント側のライブラリは要求に応じてそれを再実行できます。

いくつかのアイデアには改良が必要です。特に、DELETE の OR は明らかではありません。また、「送信する N データ」が行数または値の数を識別するかどうかを定義する必要があります。行数の場合、行内の値の数をどのように識別しますか。

于 2009-04-22T06:13:58.507 に答える