0

2 つのテーブルを持つデータベース (postgres) があります。

CREATE TABLE invoices (
    id bigint,
    some_data varchar
)

CREATE TABLE charges (
    id bigint,
    invoice_id bigint,
    some_data varchar
)

次の形式のcsvファイルをこのデータベースにロードしようとしています:

invoice_id, invoice_data, charge_id, charge_data

たとえば、csv ファイルに次の行を含めることができます。

1, $10.00, 1, $2.00
1, $10.00, 2, $5.00
1, $10.00, 3, $3.00
2, $2.00,  4, $1.00
2, $2.00,  5, $1.00
3, $11.00, 6, $11.00

このデータは、データベース内の次のレコードに対応している必要があります。

SELECT * FROM invoices;
  id | some_data
-----+-------------
  1  | $10.00
  2  | $2.00
  3  | $11.00

SELECT * FROM charges;
  id | invoice_id | some_data
-----+------------+-------------
  1  | 1          | $2.00
  2  | 1          | $5.00
  3  | 1          | $3.00
  4  | 2          | $1.00
  5  | 2          | $1.00
  6  | 3          | $11.00

この種のデータをロードするための「ベスト プラクティス」はありますか? 現時点では、このファイルを中間テーブルにロードし、php スクリプト (悪い) で処理しています。かなり非効率です。より良い方法はありますか?これを中間テーブルにロードしてから、ストアド プロシージャを使用して情報を分割する必要がありますか? それとも、.csv ファイルを直接処理して、この情報をある種のスクリプトに分割する必要がありますか?

4

1 に答える 1

1

COPY コマンドを使用して、CSV と構造が一致する中間テーブルに最初にデータをロードできます (例: COPY intermediary_table FROM '/path/to/csv/charges.csv' DELIMITER ',' CSV;)。データを各テーブルに。最初のクエリは SELECT DISTINCT 請求書 ID、請求書データ INTO 請求書 FROM 中間テーブル、2 番目のクエリは SELECT DISTINCT 請求書 ID、請求書 ID、請求書データ INTO 請求書 FROM 中間テーブルです。

ところで、おそらく bigint を使用する必要はありません (数十億の行が予想される場合を除きます)。

于 2013-10-25T18:09:22.253 に答える