89 lines
2.8 KiB
SQL
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);
|