将非规范化数据加载到数据库中

时间:2013-10-25 18:02:46

标签: php sql postgresql csv

我有一个包含两个表的数据库(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文件并将这些信息拆分成某种脚本?

1 个答案:

答案 0 :(得分:1)

您可以使用COPY命令将数据首先加载到结构与CSV匹配的中间表中(例如:COPY intermediary_table FROM'/path/to/csv/charges.csv'DELIMITER','CSV;),然后在每个表中选择数据。第一个查询是SELECT DISTINCT invoice_id,invoice_data INTO发票FROM intermediary_table,第二个查询SELECT DISTINCT charge_id,invoice_id,charge_data INTO从FROM_table收取费用。

顺便说一下,你很可能不需要使用bigint(除非你期望数十亿行)。