0

これを実装する最良の方法を提案してください:

基本的に、私が必要としているのは、PostgreSQL の仮想テーブルです。クエリを実行すると、他のテーブルからデータを検索します (これを生データ テーブルと呼びます)。しかし問題は、生データ テーブルのデータを変換する必要があることです。変換すると、元のテーブルにあるかのように結果が返されます。

イラストと例を使って説明します (私の実際のプログラムではなく、必要な主なものを説明するための単純化された例です):

生データ表

| id (int) | data (byte[]) |
----------------------------
|   ...    |      ...      |
|   ...    |      ...      |

Person テーブル (仮想テーブル)

| name (varchar) | address (varchar) | phone (varchar) |
--------------------------------------------------------
|       ...      |        ...        |       ...       |
|       ...      |        ...        |       ...       |
|       ...      |        ...        |       ...       |

私が今したいのは、次のようなことをするときです:

SELECT * FROM person WHERE name = 'Kim';
  • 生のテーブルからのデータを照会する必要があります。つまり、すべての byte[] 配列を取得します。
  • 生データから取得するデータ (名前、住所、電話番号) を逆シリアル化します。
  • name = 'Kim' など、任意の条件を適用します。
  • Person テーブルを単にクエリしたかのように、この一連の結果をユーザーに返します。

逆シリアル化/変換などのために、いくつかのプログラミング言語関数が必要になるかもしれないと推測しているので、Java ではPl/Javaなどの何かが役立つかもしれません。

また、Raw-data テーブルはそれほど長くないと想定できます。これは固定サイズのバッファーとして機能するように実装されているため、各クエリのすべてのエントリを読み取ることはそれほど問題ではありません。

概念的には、トリガー関数が必要ですが、READ にトリガーを設定することはできないようです。これについてどうすればよいかについての助けをいただければ幸いです。

4

1 に答える 1

1

そのデータベース設計は完全に壊れているように思えます。RDBMS を誤って使用して、RDBMS を再実装しようとしています。

しかし、この設計を使用することを主張する場合、私が考えることができる唯一の方法は、生データのすべての処理とアンパックを手続き的な方法で行うセットを返す関数を作成することです。バイナリ データの複雑さによっては、PL/pgSQL で十分な場合があります。

次に、必要なSELECT * FROM retrieve_person()出力を取得するために a を実行します。

于 2011-08-30T14:38:16.450 に答える