A community based topic aggregation platform built on atproto
1-- +goose Up 2-- +goose StatementBegin 3 4-- Repositories table stores metadata about each user's repository 5CREATE TABLE repositories ( 6 did VARCHAR(256) PRIMARY KEY, 7 head_cid VARCHAR(256) NOT NULL, 8 revision VARCHAR(64) NOT NULL, 9 record_count INTEGER NOT NULL DEFAULT 0, 10 storage_size BIGINT NOT NULL DEFAULT 0, 11 created_at TIMESTAMP NOT NULL DEFAULT NOW(), 12 updated_at TIMESTAMP NOT NULL DEFAULT NOW() 13); 14 15CREATE INDEX idx_repositories_updated_at ON repositories(updated_at); 16 17-- Commits table stores the commit history 18CREATE TABLE commits ( 19 cid VARCHAR(256) PRIMARY KEY, 20 did VARCHAR(256) NOT NULL, 21 version INTEGER NOT NULL, 22 prev_cid VARCHAR(256), 23 data_cid VARCHAR(256) NOT NULL, 24 revision VARCHAR(64) NOT NULL, 25 signature BYTEA NOT NULL, 26 signing_key_id VARCHAR(256) NOT NULL, 27 created_at TIMESTAMP NOT NULL DEFAULT NOW(), 28 FOREIGN KEY (did) REFERENCES repositories(did) ON DELETE CASCADE 29); 30 31CREATE INDEX idx_commits_did ON commits(did); 32CREATE INDEX idx_commits_created_at ON commits(created_at); 33 34-- Records table stores record metadata (actual data is in MST) 35CREATE TABLE records ( 36 id SERIAL PRIMARY KEY, 37 did VARCHAR(256) NOT NULL, 38 uri VARCHAR(512) NOT NULL, 39 cid VARCHAR(256) NOT NULL, 40 collection VARCHAR(256) NOT NULL, 41 record_key VARCHAR(256) NOT NULL, 42 value BYTEA NOT NULL, -- CBOR-encoded record data 43 created_at TIMESTAMP NOT NULL DEFAULT NOW(), 44 updated_at TIMESTAMP NOT NULL DEFAULT NOW(), 45 UNIQUE(did, collection, record_key), 46 FOREIGN KEY (did) REFERENCES repositories(did) ON DELETE CASCADE 47); 48 49CREATE INDEX idx_records_did_collection ON records(did, collection); 50CREATE INDEX idx_records_uri ON records(uri); 51CREATE INDEX idx_records_updated_at ON records(updated_at); 52 53-- Blobs table stores binary large objects 54CREATE TABLE blobs ( 55 cid VARCHAR(256) PRIMARY KEY, 56 mime_type VARCHAR(256) NOT NULL, 57 size BIGINT NOT NULL, 58 ref_count INTEGER NOT NULL DEFAULT 0, 59 data BYTEA NOT NULL, 60 created_at TIMESTAMP NOT NULL DEFAULT NOW() 61); 62 63CREATE INDEX idx_blobs_ref_count ON blobs(ref_count); 64CREATE INDEX idx_blobs_created_at ON blobs(created_at); 65 66-- Blob references table tracks which records reference which blobs 67CREATE TABLE blob_refs ( 68 id SERIAL PRIMARY KEY, 69 record_id INTEGER NOT NULL, 70 blob_cid VARCHAR(256) NOT NULL, 71 created_at TIMESTAMP NOT NULL DEFAULT NOW(), 72 FOREIGN KEY (record_id) REFERENCES records(id) ON DELETE CASCADE, 73 FOREIGN KEY (blob_cid) REFERENCES blobs(cid) ON DELETE RESTRICT, 74 UNIQUE(record_id, blob_cid) 75); 76 77CREATE INDEX idx_blob_refs_blob_cid ON blob_refs(blob_cid); 78 79-- +goose StatementEnd 80 81-- +goose Down 82-- +goose StatementBegin 83DROP TABLE IF EXISTS blob_refs; 84DROP TABLE IF EXISTS blobs; 85DROP TABLE IF EXISTS records; 86DROP TABLE IF EXISTS commits; 87DROP TABLE IF EXISTS repositories; 88-- +goose StatementEnd