De zip bevat een aantal bestanden:
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
die elk in een bizar, bijna CSV-achtig formaat lijken te zijn, b.v. NUTR_DEF.txt
:
~287~^~g~^~GALS~^~Galactose~^~2~^~2100~
~291~^~g~^~FIBTG~^~Fiber, total dietary~^~1~^~1200~
plus sr26_doc.pdf
, de documentatie.
Tabeldefinities maken
Dus wat u hier moet doen, is SQL-tabeldefinities voor de database maken - met één tabel voor elk invoerbestand. Je hebt de CREATE TABLE
. nodig opdracht hiervoor; zie de PostgreSQL-documentatie.
Pagina 35 van de PDF zou u moeten helpen - "Figuur 1. Relaties tussen bestanden in de USDA National Nutrient Database for Standard Reference". De volgende pagina's beschrijven de bestandsindelingen en vertellen u wat elke kolom betekent. U kunt CREATE TABLE
. schrijven uitspraken op basis van deze beschrijving.
Hier is een voorbeeld voor FOOD_DES.txt
(voedselbeschrijving), het eerste item.
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)
);
Dat is een vrij letterlijke kopie van de beschrijving. Zo zou ik de tafel niet ontwerpen
Ik heb NUMERIC
. gebruikt willekeurige precisie decimale drijvende-komma typen voor nauwkeurigheid in niet-gehele numerieke typen. Als prestaties belangrijker zijn dan nauwkeurigheid, kunt u float4
. gebruiken in plaats daarvan.
Voor relaties gebruik je FOREIGN KEY
beperkingen - gewoon colname coltype REFERENCES othertable(othercol)
is voldoende om er een te maken.
Belangrijk :Ik heb de kolomnamen dubbel geciteerd om dezelfde naam als in de definities te behouden. Dat betekent dat je ze altijd dubbel moet citeren als je ernaar verwijst, b.v. SELECT "NDB_No" FROM food_des;
. Als je dat niet wilt, laat dan de dubbele aanhalingstekens weg - of kies andere namen. Je hoeft je niet te houden aan de onhandige afgekorte kolomnamen die ze gebruikten, en het is redelijk om te schrijven:
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),
enz. Evenzo, als u met Rails werkt, kunt u de tabeldefinities converteren om de conventies van Rails te volgen, vooral als u vervolgens van plan bent de gegevens via Rails te laden.
Gegevens laden
Als dit normale, verstandige, gescheiden bestanden waren, kon je elke tabel gewoon laden met de psql
commando \copy
, of de "import"-optie van PgAdmin-III.
Het is eigenlijk CSV, ze hebben zojuist besloten om totaal bizarre scheidingstekens en aanhalingstekens te gebruiken. Importeren via psql
met:
\copy food_des FROM 'FOOD_DES.txt' (FORMAT CSV, DELIMITER '^', QUOTE '~');
of het equivalent in welke tool je ook gebruikt om met PostgreSQL te praten.
De resultaten zijn een verstandig ogende tabel:
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)
Evenzo, als je Rails gebruikt, kun je elke Rails CSV-bibliotheek gebruiken die je wilt en bulksgewijs in modellen laden.