ZIP-filen innehåller ett antal filer:
inflating: DATA_SRC.txt
inflating: DATSRCLN.txt
inflating: DERIV_CD.txt
inflating: FD_GROUP.txt
inflating: FOOD_DES.txt
inflating: FOOTNOTE.txt
inflating: LANGDESC.txt
inflating: LANGUAL.txt
inflating: NUT_DATA.txt
inflating: NUTR_DEF.txt
inflating: sr26_doc.pdf
inflating: SRC_CD.txt
inflating: WEIGHT.txt
som var och en verkar vara i ett bisarrt nästan CSV-liknande format, t.ex. NUTR_DEF.txt :
~287~^~g~^~GALS~^~Galactose~^~2~^~2100~
~291~^~g~^~FIBTG~^~Fiber, total dietary~^~1~^~1200~
plus sr26_doc.pdf , dokumentationen.
Skapa tabelldefinitioner
Så vad du behöver göra här är att skapa SQL-tabelldefinitioner för databasen - med en tabell för varje indatafil. Du behöver CREATE TABLE kommando för detta; se PostgreSQL-dokumentationen.
Sidan 35 i PDF-filen bör hjälpa dig - "Figur 1. Relationer mellan filer i USDA National Nutrient Database for Standard Reference". Följande sidor beskriver filformaten och berättar vad varje kolumn betyder. Du kan skriva CREATE TABLE uttalanden baserade på denna beskrivning.
Här är ett exempel för FOOD_DES.txt (matbeskrivning), den första posten.
CREATE TABLE food_des (
"NDB_No" varchar(5) NOT NULL PRIMARY KEY,
"FdGrp_Cd" varchar(4) NOT NULL,
"Long_Desc" varchar(200) NOT NULL,
"Shrt_Desc" varchar(60) NOT NULL,
"ComName" varchar(100),
"ManufacName" varchar(65),
"Survey" varchar(1),
"Ref_desc" varchar(135),
"Refuse" smallint,
"SciName" varchar(65),
"N_Factor" NUMERIC(4,2),
"Pro_Factor" NUMERIC(4,2),
"Fat_Factor" NUMERIC(4,2),
"CHO_Factor" NUMERIC(4,2)
);
Det är en ganska bokstavlig kopia av beskrivningen. Det är inte så jag skulle designa bordet
Jag har använt NUMERIC godtycklig precision decimal flyttalstyper för noggrannhet i icke-heltals numeriska typer. Om prestanda är viktigare än noggrannhet kan du använda float4 istället.
För relationer använder du FOREIGN KEY begränsningar - bara colname coltype REFERENCES othertable(othercol) är tillräckligt för att skapa en.
Viktigt :Jag dubbelciterade kolumnnamnen för att behålla samma namn som i definitionerna. Det betyder att du alltid måste dubbelcitera dem när du refererar till dem, t.ex. SELECT "NDB_No" FROM food_des; . Om du inte vill det är det bara att lämna de dubbla citattecken – eller välja andra namn. Du behöver inte hålla dig till de klumpiga förkortade kolumnnamnen de använde, och det är ganska rimligt att skriva:
CREATE TABLE food_description (
ndb_no varchar(5) NOT NULL PRIMARY KEY,
foodgroup_code varchar(4) NOT NULL,
long_description varchar(200) NOT NULL,
short_description varchar(60) NOT NULL,
common_name varchar(100),
manufacturer_name varchar(65),
etc. På samma sätt, om du arbetar med Rails, kan du konvertera tabelldefinitionerna så att de följer Rails konventioner, speciellt om du sedan tänker ladda data via Rails.
Laddar data
Om dessa var förnuftiga, förnuftiga avgränsade filer kunde du sedan bara ladda varje tabell med psql kommandot \copy , eller PgAdmin-III:s "import"-alternativ.
Det är faktiskt CSV, de har precis bestämt sig för att använda helt bisarra avgränsare och citattecken. Importera via psql med:
\copy food_des FROM 'FOOD_DES.txt' (FORMAT CSV, DELIMITER '^', QUOTE '~');
eller motsvarande i vilket verktyg du än använder för att prata med PostgreSQL.
Resultaten är en förnuftig tabell:
craig=> select * from food_des limit 2;
NDB_No | FdGrp_Cd | Long_Desc | Shrt_Desc | ComName | ManufacName | Survey | Ref_desc | Refuse | SciName | N_Factor | Pro_Factor | Fat_Factor | CHO_Factor
--------+----------+----------------------------+--------------------------+---------+-------------+--------+----------+--------+---------+----------+------------+------------+------------
01001 | 0100 | Butter, salted | BUTTER,WITH SALT | | | Y | | 0 | | 6.38 | 4.27 | 8.79 | 3.87
01002 | 0100 | Butter, whipped, with salt | BUTTER,WHIPPED,WITH SALT | | | Y | | 0 | | 6.38 | 4.27 | 8.79 | 3.87
(2 rows)
På samma sätt, om du använder Rails kan du använda vilket Rails CSV-bibliotek du vill och massladda in i modeller.