Motion database: Difference between revisions

From Wildsong
Jump to navigationJump to search
Brian Wilson (talk | contribs)
Brian Wilson (talk | contribs)
Line 25: Line 25:
== Tables ==
== Tables ==
   
   
The vehicle table is used to describe a vehicle
  DROP TABLE IF EXISTS vehicle;
  DROP TABLE IF EXISTS vehicle;
  CREATE TABLE vehicle (
  CREATE TABLE vehicle (
Line 41: Line 43:
  INSERT INTO vehicle (name) VALUES ('Toyota Yaris');
  INSERT INTO vehicle (name) VALUES ('Toyota Yaris');
  INSERT INTO vehicle (name) VALUES ('MG Midget');
  INSERT INTO vehicle (name) VALUES ('MG Midget');
   
 
The rider table describes people who can be bicyclists or car drivers/passengers.
 
  DROP TABLE IF EXISTS rider;
CREATE TABLE rider (
  rider_id SERIAL NOT NULL,
  name VARCHAR(10) NOT NULL,
  PRIMARY KEY (rider_id)
);
 
INSERT INTO rider (name) VALUES ('Brian');
INSERT INTO rider (name) VALUES ('Julie');
 
SELECT date, name, mileage FROM trip,rider WHERE trip.rider_id=rider.rider_id;
 
One trip can have more than one bicyclist and that means more than one rider,
or one vehicle can carry two riders on one trip,
so we need a junction table to link together riders, vehicles, and trips.
I don't care who drives if more than one person is in a car together. (Maybe they take turns.)
 
DROP TABLE IF EXISTS trip;
CREATE TABLE trip (
  tag CHAR DEFAULT 'T',
  trip_id SERIAL NOT NULL,
  date DATE,
  mileage NUMERIC,
  notes TEXT,
  gpxlog TEXT,
  PRIMARY KEY(trip_id)
);
 
INSERT INTO trip (date,mileage,vehicle_id,notes) VALUES ('3/14/2013',15,1,1,'Airport loop');
INSERT INTO trip (date,mileage,vehicle_id,notes) VALUES ('3/15/2013',22,1,1,'Airport loop + Walnut Ave');
INSERT INTO trip (date,mileage,vehicle_id,notes) VALUES ('3/15/2013',22,2,4,'Airport loop + Walnut Ave');
 
SELECT date, name, mileage FROM trip,rider WHERE trip.rider_id=rider.rider_id;
 
DROP TABLE IF EXISTS j_trips;
CREATE TABLE j_trip (
  vehicle_id INT, FOREIGN KEY (vehicle_id) REFERENCES vehicle(vehicle_id),
  trip_id INT, FOREIGN KEY (trip_id) REFERENCES trip(trip_id),
);
 
 
  DROP TABLE IF EXISTS photo;
  DROP TABLE IF EXISTS photo;
  CREATE TABLE photo (
  CREATE TABLE photo (
Line 67: Line 112:
  DROP TABLE IF EXISTS maintenance;
  DROP TABLE IF EXISTS maintenance;
  CREATE TABLE maintenance (
  CREATE TABLE maintenance (
  tag CHAR DEFAULT 'M',
   maint_id SERIAL NOT NULL,
   maint_id SERIAL NOT NULL,
   date DATE,
   date DATE,
Line 81: Line 125:
  SELECT date,name,maintenance.description FROM maintenance,vehicle WHERE maintenance.vehicle_id=vehicle.vehicle_id;
  SELECT date,name,maintenance.description FROM maintenance,vehicle WHERE maintenance.vehicle_id=vehicle.vehicle_id;


DROP TABLE IF EXISTS rider;
CREATE TABLE rider (
  rider_id SERIAL NOT NULL,
  name VARCHAR(10) NOT NULL,
  PRIMARY KEY (rider_id)
);


INSERT INTO rider (name) VALUES ('Brian');
INSERT INTO rider (name) VALUES ('Julie');
DROP TABLE IF EXISTS trip;
CREATE TABLE trip (
  tag CHAR DEFAULT 'T',
  trip_id SERIAL NOT NULL,
  date DATE,
  mileage NUMERIC,
  rider_id INT, FOREIGN KEY (rider_id) REFERENCES rider(rider_id),
  vehicle_id INT, FOREIGN KEY (vehicle_id) REFERENCES vehicle(vehicle_id),
  notes TEXT,
  gpxlog TEXT,
  PRIMARY KEY(trip_id)
);
INSERT INTO trip (date,mileage,rider_id,vehicle_id,notes) VALUES ('3/14/2013',15,1,1,'Airport loop');
INSERT INTO trip (date,mileage,rider_id,vehicle_id,notes) VALUES ('3/15/2013',22,1,1,'Airport loop + Walnut Ave');
INSERT INTO trip (date,mileage,rider_id,vehicle_id,notes) VALUES ('3/15/2013',22,2,4,'Airport loop + Walnut Ave');
SELECT date, name, mileage FROM trip,rider WHERE trip.rider_id=rider.rider_id;


[[Category: PostgreSQL]]
[[Category: PostgreSQL]]

Revision as of 02:21, 19 March 2013

The Motion Database is used to keep track of my rolling stock including cars and bicycles. It's a demo database for developing concepts in PostgreSQL and Wavemaker.

I could do photo/image processing in the database if I installed PostPIC. http://drotiro.github.com/postpic/

Create the database and add extensions

createdb -U webadmin motion
psql -U webadmin motion
CREATE EXTENSION postgis;

# Add support for Large Objects
CREATE EXTENSION lo;
# Show installed extensions
SELECT * FROM pg_available_extensions
WHERE comment LIKE '%string%' OR installed_version IS NOT NULL ORDER BY name;
# Get more info on an extension
\dx+ postgis
\dx+ lo

Tables

The vehicle table is used to describe a vehicle

DROP TABLE IF EXISTS vehicle;
CREATE TABLE vehicle (
 tag CHAR DEFAULT 'V',
 vehicle_id SERIAL NOT NULL, 
 name VARCHAR(40) NOT NULL,
 description TEXT,
 serial_number VARCHAR(40),
 PRIMARY KEY(vehicle_id)
);
INSERT INTO vehicle (name) VALUES ('Davidson Discovery');
INSERT INTO vehicle (name) VALUES ('Fuji Touring Series');
INSERT INTO vehicle (name) VALUES ('Longbikes Slipstream');
INSERT INTO vehicle (name) VALUES ('Specialized Stumpjumper');
INSERT INTO vehicle (name) VALUES ('Toyota Yaris');
INSERT INTO vehicle (name) VALUES ('MG Midget');

The rider table describes people who can be bicyclists or car drivers/passengers.

DROP TABLE IF EXISTS rider;
CREATE TABLE rider (
 rider_id SERIAL NOT NULL,
 name VARCHAR(10) NOT NULL,
 PRIMARY KEY (rider_id)
);
INSERT INTO rider (name) VALUES ('Brian');
INSERT INTO rider (name) VALUES ('Julie');
SELECT date, name, mileage FROM trip,rider WHERE trip.rider_id=rider.rider_id;

One trip can have more than one bicyclist and that means more than one rider, or one vehicle can carry two riders on one trip, so we need a junction table to link together riders, vehicles, and trips. I don't care who drives if more than one person is in a car together. (Maybe they take turns.)

DROP TABLE IF EXISTS trip;
CREATE TABLE trip (
 tag CHAR DEFAULT 'T',
 trip_id SERIAL NOT NULL,
 date DATE,
 mileage NUMERIC,
 notes TEXT,
 gpxlog TEXT,
 PRIMARY KEY(trip_id)
);
INSERT INTO trip (date,mileage,vehicle_id,notes) VALUES ('3/14/2013',15,1,1,'Airport loop');
INSERT INTO trip (date,mileage,vehicle_id,notes) VALUES ('3/15/2013',22,1,1,'Airport loop + Walnut Ave');
INSERT INTO trip (date,mileage,vehicle_id,notes) VALUES ('3/15/2013',22,2,4,'Airport loop + Walnut Ave');
SELECT date, name, mileage FROM trip,rider WHERE trip.rider_id=rider.rider_id;
DROP TABLE IF EXISTS j_trips;
CREATE TABLE j_trip (
 vehicle_id INT, FOREIGN KEY (vehicle_id) REFERENCES vehicle(vehicle_id),
 trip_id INT, FOREIGN KEY (trip_id) REFERENCES trip(trip_id),
);


DROP TABLE IF EXISTS photo;
CREATE TABLE photo (
 photo_id SERIAL NOT NULL,
 thumbnail BYTEA,
 image LO,
 description TEXT,
 location POINT,
 vehicle_id INT NOT NULL, 
 FOREIGN KEY (vehicle_id) REFERENCES vehicle(vehicle_id),
 PRIMARY KEY(photo_id)
);
CREATE TRIGGER t_image BEFORE UPDATE OR DELETE ON photo
   FOR EACH ROW EXECUTE PROCEDURE lo_manage(image);
INSERT INTO photo (description,vehicle_id) VALUES ('d',1);
INSERT INTO photo (description,vehicle_id) VALUES ('f',2);
INSERT INTO photo (description,vehicle_id) VALUES ('l',3);
INSERT INTO photo (description,vehicle_id) VALUES ('t1',5);
INSERT INTO photo (description,vehicle_id) VALUES ('t2',5);
INSERT INTO photo (description,vehicle_id) VALUES ('mg',6);
SELECT name,photo.description FROM vehicle, photo WHERE vehicle.vehicle_id = photo.vehicle_id;

DROP TABLE IF EXISTS maintenance;
CREATE TABLE maintenance (
 maint_id SERIAL NOT NULL,
 date DATE,
 description TEXT,
 notes TEXT,
 vehicle_id INT, FOREIGN KEY(vehicle_id) REFERENCES vehicle(vehicle_id),
 PRIMARY KEY(maint_id)
);
INSERT INTO maintenance (date, description, vehicle_id) VALUES ('2/1/2013', 'Oiled chain', 1);
INSERT INTO maintenance (date, description, notes, vehicle_id) VALUES ('3/17/2013', 'New front wheel', 'Phil Wood hub', 4);

SELECT date,name,maintenance.description FROM maintenance,vehicle WHERE maintenance.vehicle_id=vehicle.vehicle_id;