bsdaily/schema.sql
2026-02-09 00:42:06 -08:00

89 lines
2.8 KiB
SQL

CREATE TABLE posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL,
sequence INTEGER NOT NULL,
user_did TEXT NOT NULL,
user_handle TEXT,
record_key TEXT NOT NULL,
permalink TEXT,
action TEXT NOT NULL,
cid TEXT,
text TEXT,
created_at TEXT,
langs TEXT,
reply TEXT,
embed TEXT,
facets TEXT,
tags TEXT,
labels TEXT,
has_media BOOLEAN DEFAULT FALSE,
blob_cids TEXT,
raw_json TEXT NOT NULL,
ingested_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(user_did, record_key)
);
CREATE TABLE sqlite_sequence(name,seq);
CREATE INDEX idx_posts_timestamp ON posts(timestamp);
CREATE INDEX idx_posts_user_did ON posts(user_did);
CREATE INDEX idx_posts_user_handle ON posts(user_handle);
CREATE INDEX idx_posts_record_key ON posts(record_key);
CREATE INDEX idx_posts_action ON posts(action);
CREATE TABLE users (
did TEXT PRIMARY KEY,
handle TEXT NOT NULL,
display_name TEXT,
resolved_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_users_handle ON users(handle);
CREATE TABLE media (
id INTEGER PRIMARY KEY AUTOINCREMENT,
url TEXT NOT NULL UNIQUE,
url_hash TEXT NOT NULL,
content_hash TEXT,
file_path TEXT,
file_size INTEGER,
content_type TEXT,
status TEXT DEFAULT 'pending',
downloaded_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
error TEXT
);
CREATE INDEX idx_media_url_hash ON media(url_hash);
CREATE INDEX idx_media_content_hash ON media(content_hash);
CREATE INDEX idx_media_status ON media(status);
CREATE TABLE hashtags (
id INTEGER PRIMARY KEY AUTOINCREMENT,
tag TEXT NOT NULL UNIQUE,
first_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
use_count INTEGER DEFAULT 1
);
CREATE INDEX idx_hashtags_tag ON hashtags(tag);
CREATE TABLE posts_hashtags (
post_id INTEGER NOT NULL,
hashtag_id INTEGER NOT NULL,
PRIMARY KEY (post_id, hashtag_id),
FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
FOREIGN KEY (hashtag_id) REFERENCES hashtags(id) ON DELETE CASCADE
);
CREATE INDEX idx_posts_hashtags_post_id ON posts_hashtags(post_id);
CREATE INDEX idx_posts_hashtags_hashtag_id ON posts_hashtags(hashtag_id);
CREATE TABLE urls (
id INTEGER PRIMARY KEY AUTOINCREMENT,
url TEXT NOT NULL UNIQUE,
domain TEXT NOT NULL,
first_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
use_count INTEGER DEFAULT 1
);
CREATE INDEX idx_urls_url ON urls(url);
CREATE INDEX idx_urls_domain ON urls(domain);
CREATE TABLE posts_urls (
post_id INTEGER NOT NULL,
url_id INTEGER NOT NULL,
PRIMARY KEY (post_id, url_id),
FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
FOREIGN KEY (url_id) REFERENCES urls(id) ON DELETE CASCADE
);
CREATE INDEX idx_posts_urls_post_id ON posts_urls(post_id);
CREATE INDEX idx_posts_urls_url_id ON posts_urls(url_id);