4

比較的大きな文字列 (10000 文字) を格納するテーブルがあります。

多くの行 (数百万?) がありますが、それらの 99% は大きな文字列と同じ値になります。

postgres にこのケースを適切に処理するメカニズムがあるかどうかは誰にもわかりませんか? (つまり、ギガ規模のストレージを使用しないでください)

4

4 に答える 4

6

PostgreSQLは内部的に大きな値を圧縮します。ただし、複数の行の値が同じであることは検出されません。そのような検出が必要な場合は、自分で行う必要があります。たとえば、次のようなスキーマを使用します。

CREATE TABLE big_texts (
    id       SERIAL PRIMARY KEY,
    big_text TEXT NOT NULL DEFAULT ''
);


CREATE TABLE base_table (
    id          SERIAL PRIMARY KEY,
    big_text_id INT4 NOT NULL REFERENCES big_texts (id),
    other       TEXT,
    columns     INT8,
);
于 2013-02-07T14:17:10.067 に答える
5

たくさんの行(数百万?)がありますが、それらの99%は大きな文字列と同じ値になります。

その場合、一意の「大きな文字列」を別のテーブルに格納し、他のテーブルからの右側の行への参照を保持します。

于 2013-02-07T14:16:30.443 に答える
4

実際には、MD5 を ID として使用することを検討することをお勧めします。Postgres は MD5 をサポートしています。

したがって、@depesz の変更されたスキーマを使用して挿入できます。

CREATE TABLE big_text (
    id  VARCHAR(32) NOT NULL,
    big_text TEXT NOT NULL,
    CONSTRAINT big_text_pkey PRIMARY KEY (id)
);

ID は、ホスト言語でプログラムによって作成するか、Postgres を使用して作成できます: http://www.postgresql.org/docs/9.1/static/functions-string.html

次に、次のようなことができます。

INSERT INTO big_text (id, big_text) VALUES (md5(big_text), big_text);

挿入が失敗した場合、データベースには既にテキストがあります。明らかに、最初に md5 値を選択することで、より適切な方法でこれを行うことができます。

10000キャラクターはそれほど大規模ではありませんが、本当にスケーリングしたい場合は、ブルームフィルターなどを調べることもできます.

于 2013-02-07T14:18:58.597 に答える