drop table if exists tags; drop table if exists resources; drop table if exists bookmarks; -- resources by URI -- this is where we would store information about the resource, -- such as its title, last known status, etc. create table resources ( uri varchar primary key, title varchar -- URI title (e.g., page title) ); -- bookmarks of resources -- each resource can only have one bookmark -- bookmarks have creation and modification times create table bookmarks ( id integer primary key, uri varchar references resources(uri) on update cascade, ctime integer, -- creation time of the bookmark mtime integer, -- modification time of the bookmark constraint unique_uri unique (uri) ); /* old resources table create table resources ( uri varchar primary key, title varchar, -- URI title (e.g., page title) ctime integer, -- creation time of the bookmark mtime integer -- modification time of the bookmark ); */ -- tags that describe the resource -- TODO: machine-tag style tags? e.g. format:video or creator:NASA; implicit tag prefix is "subject:" create table tags ( uri varchar references resources(uri) on update cascade, tag varchar, constraint unique_tag primary key (uri, tag) ); /* create a new resource: insert into resources (uri, title) values ('http://echodin.net/', 'More Space'); create a bookmark of that resource: insert into bookmarks (uri, ctime, mtime) values ('http://echodin.net/', 1323407821, 1323407821); tag that resource: insert into tags (uri, tag) values ('http://echodin.net/', 'homepage'); The resource's primary key is the URI. The bookmark id identifies the bookmark only, NOT the bookmarked resource get the bookmark and its resource values select id,resources.uri,title,ctime,mtime from bookmarks join resources on bookmarks.uri=resources.uri where id=1; */