You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

100 lines
3.7 KiB

CREATE TABLE `categories` (
`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
`name` text NOT NULL,
`icon` text DEFAULT '📁' NOT NULL,
`color` text DEFAULT '#6B7280',
`parent_id` integer,
`sort_order` integer DEFAULT 0 NOT NULL,
`created_at` integer DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer)) NOT NULL,
`updated_at` integer DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer)) NOT NULL,
FOREIGN KEY (`parent_id`) REFERENCES `categories`(`id`) ON UPDATE no action ON DELETE set null
);
--> statement-breakpoint
CREATE TABLE `item_tags` (
`item_id` integer NOT NULL,
`tag_id` integer NOT NULL,
FOREIGN KEY (`item_id`) REFERENCES `items`(`id`) ON UPDATE no action ON DELETE cascade,
FOREIGN KEY (`tag_id`) REFERENCES `tags`(`id`) ON UPDATE no action ON DELETE cascade
);
--> statement-breakpoint
CREATE TABLE `items` (
`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
`user_id` integer NOT NULL,
`type` text NOT NULL,
`title` text NOT NULL,
`description` text,
`content` text,
`url` text,
`cover_url` text,
`favicon_url` text,
`source_host` text,
`file_path` text,
`file_size` integer,
`file_mime` text,
`category_id` integer,
`note` text,
`rating` integer,
`starred` integer DEFAULT false NOT NULL,
`is_archived` integer DEFAULT false NOT NULL,
`ai_summary` text,
`published_at` text,
`created_at` integer DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer)) NOT NULL,
`updated_at` integer DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer)) NOT NULL,
FOREIGN KEY (`category_id`) REFERENCES `categories`(`id`) ON UPDATE no action ON DELETE set null
);
--> statement-breakpoint
CREATE TABLE `settings` (
`key` text PRIMARY KEY NOT NULL,
`value` text,
`updated_at` integer DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer)) NOT NULL
);
--> statement-breakpoint
CREATE TABLE `tags` (
`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
`name` text NOT NULL,
`color` text DEFAULT '#6B7280',
`created_at` integer DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer)) NOT NULL
);
--> statement-breakpoint
CREATE UNIQUE INDEX `tags_name_unique` ON `tags` (`name`);--> statement-breakpoint
-- FTS5 全文搜索虚拟表
CREATE VIRTUAL TABLE items_fts USING fts5(
id UNINDEXED,
title,
description,
content,
note,
content=items,
content_rowid=id,
tokenize='unicode61 remove_diacritics 1'
);--> statement-breakpoint
-- FTS5 同步触发器:INSERT
CREATE TRIGGER items_fts_ai AFTER INSERT ON items BEGIN
INSERT INTO items_fts(rowid, title, description, content, note)
VALUES (new.id, new.title, new.description, new.content, new.note);
END;--> statement-breakpoint
-- FTS5 同步触发器:DELETE
CREATE TRIGGER items_fts_ad AFTER DELETE ON items BEGIN
INSERT INTO items_fts(items_fts, rowid, title, description, content, note)
VALUES ('delete', old.id, old.title, old.description, old.content, old.note);
END;--> statement-breakpoint
-- FTS5 同步触发器:UPDATE
CREATE TRIGGER items_fts_au AFTER UPDATE ON items BEGIN
INSERT INTO items_fts(items_fts, rowid, title, description, content, note)
VALUES ('delete', old.id, old.title, old.description, old.content, old.note);
INSERT INTO items_fts(rowid, title, description, content, note)
VALUES (new.id, new.title, new.description, new.content, new.note);
END;--> statement-breakpoint
-- 常用查询索引
CREATE INDEX idx_items_user ON items(user_id);
CREATE INDEX idx_items_type ON items(type);
CREATE INDEX idx_items_category ON items(category_id);
CREATE INDEX idx_items_starred ON items(starred);
CREATE INDEX idx_items_created ON items(created_at DESC);
CREATE INDEX idx_item_tags_tag ON item_tags(tag_id);
CREATE UNIQUE INDEX idx_item_tags_unique ON item_tags(item_id, tag_id);