+--------------------------------------------------------------------------------
+-- Authenticated sessions
+--------------------------------------------------------------------------------
+
+-- Authenticated sessions
+CREATE TABLE sessions (
+ session_id text PRIMARY KEY, -- Session identifier
+ expires timestamp without time zone
+) WITH OIDS;
+
+-- People can have multiple sessions
+CREATE TABLE person_session (
+ person_id integer REFERENCES persons NOT NULL, -- Account identifier
+ session_id text REFERENCES sessions NOT NULL, -- Session identifier
+ PRIMARY KEY (person_id, session_id),
+ UNIQUE (session_id) -- Sessions are unique
+) WITH OIDS;
+CREATE INDEX person_session_person_id_idx ON person_session (person_id);
+
+-- Nodes can have only one session
+CREATE TABLE node_session (
+ node_id integer REFERENCES nodes NOT NULL, -- Node identifier
+ session_id text REFERENCES sessions NOT NULL, -- Session identifier
+ UNIQUE (node_id), -- Nodes can have only one session
+ UNIQUE (session_id) -- Sessions are unique
+) WITH OIDS;
+
+--------------------------------------------------------------------------------
+-- Message templates
+--------------------------------------------------------------------------------
+
+CREATE TABLE messages (
+ message_id text PRIMARY KEY, -- Message name
+ subject text, -- Message summary
+ template text, -- Message template
+ enabled bool NOT NULL DEFAULT true -- Whether message is enabled
+) WITH OIDS;
+
+--------------------------------------------------------------------------------
+-- Events
+--------------------------------------------------------------------------------
+
+-- Event types
+CREATE TABLE event_types (
+ event_type text PRIMARY KEY -- Event type
+) WITH OIDS;
+INSERT INTO event_types (event_type) VALUES ('Add');
+INSERT INTO event_types (event_type) VALUES ('AddTo');
+INSERT INTO event_types (event_type) VALUES ('Get');
+INSERT INTO event_types (event_type) VALUES ('Update');
+INSERT INTO event_types (event_type) VALUES ('Delete');
+INSERT INTO event_types (event_type) VALUES ('DeleteFrom');
+INSERT INTO event_types (event_type) VALUES ('Unknown');
+
+-- Object types
+CREATE TABLE object_types (
+ object_type text PRIMARY KEY -- Object type
+) WITH OIDS;
+INSERT INTO object_types (object_type) VALUES ('AddressType');
+INSERT INTO object_types (object_type) VALUES ('Address');
+INSERT INTO object_types (object_type) VALUES ('BootState');
+INSERT INTO object_types (object_type) VALUES ('ConfFile');
+INSERT INTO object_types (object_type) VALUES ('KeyType');
+INSERT INTO object_types (object_type) VALUES ('Key');
+INSERT INTO object_types (object_type) VALUES ('Message');
+INSERT INTO object_types (object_type) VALUES ('NetworkMethod');
+INSERT INTO object_types (object_type) VALUES ('NetworkType');
+INSERT INTO object_types (object_type) VALUES ('Network');
+INSERT INTO object_types (object_type) VALUES ('NodeGroup');
+INSERT INTO object_types (object_type) VALUES ('NodeNetwork');
+INSERT INTO object_types (object_type) VALUES ('Node');
+INSERT INTO object_types (object_type) VALUES ('PCU');
+INSERT INTO object_types (object_type) VALUES ('Person');
+INSERT INTO object_types (object_type) VALUES ('Role');
+INSERT INTO object_types (object_type) VALUES ('Session');
+INSERT INTO object_types (object_type) VALUES ('Site');
+INSERT INTO object_types (object_type) VALUES ('SliceAttributeType');
+INSERT INTO object_types (object_type) VALUES ('SliceAttribute');
+INSERT INTO object_types (object_type) VALUES ('Slice');
+INSERT INTO object_types (object_type) VALUES ('SliceInstantiation');
+INSERT INTO object_types (object_type) VALUES ('Unknown');
+
+-- Events
+CREATE TABLE events (
+ event_id serial PRIMARY KEY, -- Event identifier
+ person_id integer REFERENCES persons, -- Person responsible for event, if any
+ node_id integer REFERENCES nodes, -- Node responsible for event, if any
+ event_type text REFERENCES event_types NOT NULL DEFAULT 'Unknown', -- Event type
+ object_type text REFERENCES object_types NOT NULL DEFAULT 'Unknown', -- Object type associated with event
+ fault_code integer NOT NULL DEFAULT 0, -- Did this event result in error
+ call text NOT NULL, -- Call responsible for this event
+ runtime float, -- Event run time
+ time timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP -- Event timestamp
+) WITH OIDS;
+
+-- Event objects
+CREATE TABLE event_object (
+ event_id integer REFERENCES events NOT NULL, -- Event identifier
+ object_id integer NOT NULL -- Object identifier
+) WITH OIDS;
+CREATE INDEX event_object_event_id_idx ON event_object (event_id);
+CREATE INDEX event_object_object_id_idx ON event_object (object_id);
+
+CREATE VIEW event_objects AS
+SELECT event_id,
+array_accum(object_id) AS object_ids
+FROM event_object
+GROUP BY event_id;