-- Enable foreign key support PRAGMA foreign_keys = ON; PRAGMA journal_mode = WAL; PRAGMA cache_size = -2000; PRAGMA mmap_size = 30000000000; -- Words table CREATE TABLE expressions( id INTEGER PRIMARY KEY AUTOINCREMENT, spelling TEXT NOT NULL, ipa TEXT NOT NULL, language_id INTEGER NOT NULL, frequency INTEGER, type TEXT NOT NULL, subtype TEXT, FOREIGN KEY (language_id) REFERENCES languages(id) ); CREATE INDEX idx_words_spelling ON expressions(spelling); CREATE INDEX idx_words_type ON expressions(type); CREATE INDEX idx_words_subtype ON expressions(subtype); CREATE INDEX idx_words_language_id ON expressions(language_id); CREATE TABLE expression_words( expression_id INTEGER NOT NULL, word_id INTEGER NOT NULL, PRIMARY KEY (expression_id, word_id), FOREIGN KEY (word_id) REFERENCES expressions(id), FOREIGN KEY (expression_id) REFERENCES expressions(id) ); -- Languages table CREATE TABLE languages ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL ); -- Parts of Speech table CREATE TABLE parts_of_speech ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL ); -- Categories table (for noun and verb categories) CREATE TABLE categories ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, part_of_speech_id INTEGER NOT NULL, FOREIGN KEY (part_of_speech_id) REFERENCES parts_of_speech(id) ); CREATE INDEX idx_categories_name ON categories(name); CREATE INDEX idx_categories_part_of_speech_id ON categories(part_of_speech_id); -- Word Categories junction table CREATE TABLE word_categories ( word_id INTEGER NOT NULL, category_id INTEGER NOT NULL, PRIMARY KEY (word_id, category_id), FOREIGN KEY (word_id) REFERENCES words(id), FOREIGN KEY (category_id) REFERENCES categories(id) ); CREATE INDEX idx_word_categories_category_id ON word_categories(category_id); -- Example data insertion INSERT INTO languages (name) VALUES ('en-us'); INSERT INTO languages (name) VALUES ('th'); INSERT INTO languages (name) VALUES ('zh-cn'); INSERT INTO languages (name) VALUES ('zh-hk'); INSERT INTO languages (name) VALUES ('ja-jp'); INSERT INTO parts_of_speech (name) VALUES ('noun'), ('verb'), ('adjective'), ('adverb'), ('pronoun'), ('adposition'), ('conjunction'), ('unknown'); INSERT INTO categories (name, part_of_speech_id) VALUES ('countable', 1), ('uncountable', 1), ('animate', 1), ('inanimate', 1), ('spatial', 1), ('temporal', 1), ('abstract', 1), ('noun', 1), -- verbs ('transitive', 2), ('intransitive', 2), ('action', 2), ('mental', 2), ('auxiliar', 2), ('verb', 2), -- adjectives ('adjective', 3), -- adverbs ('adverb', 4), -- pronouns ('nominative', 5), ('accusative', 5), ('genitive', 5), -- adpositions ('preposition', 6), ('postposition', 6), ('circumposition', 6), -- conjunctions ('conjunction', 7), -- ? ('unknown', 8); -- -- Example word insertion -- INSERT INTO words (spelling, ipa, language_id) VALUES ('book', 'bʊk', 1); -- -- Categorize 'book' as a countable, inanimate noun -- INSERT INTO word_categories (word_id, category_id) -- SELECT -- (SELECT id FROM words WHERE spelling = 'book'), -- id -- FROM categories -- WHERE name IN ('countable', 'inanimate'); -- -- Example verb insertion -- INSERT INTO words (spelling, ipa, language_id) VALUES ('think','θɪŋk', 1); -- -- Categorize 'think' as an intransitive, mental verb -- INSERT INTO word_categories (word_id, category_id) -- SELECT -- (SELECT id FROM words WHERE spelling = 'think'), -- id -- FROM categories -- WHERE name IN ('intransitive', 'mental'); -- Progress CREATE TABLE users( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, creds TEXT NOT NULL ); -- Lessons CREATE TABLE lessons( id INTEGER PRIMARY KEY AUTOINCREMENT, text TEXT NOT NULL ); CREATE TABLE cards( id INTEGER PRIMARY KEY AUTOINCREMENT, text TEXT NOT NULL, note TEXT ); CREATE TABLE cards_expressions( expression_id INTEGER NOT NULL, card_id INTEGER NOT NULL, PRIMARY KEY (card_id, expression_id), FOREIGN KEY (card_id) REFERENCES cards(id), FOREIGN KEY (expression_id) REFERENCES expressions(id) ); CREATE TABLE cards_lessons( lesson_id INTEGER, card_id INTEGER NOT NULL, PRIMARY KEY (card_id, lesson_id), FOREIGN KEY (card_id) REFERENCES cards(id), FOREIGN KEY (lesson_id) REFERENCES lessons(id) ); CREATE TABLE attempts( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, timestamp INTEGER NOT NULL, card_id INTEGER NOT NULL, good INTEGER NOT NULL, -- 0 or 1 FOREIGN KEY (user_id) REFERENCES users(id) FOREIGN KEY (card_id) REFERENCES cards(id) ); -- Index to query attempts on a specific card CREATE INDEX idx_attempts_card ON attempts(card_id); -- Index to query attempts for a specific user CREATE INDEX idx_attempts_user ON attempts(user_id); -- (Optional) Index to query attempts by user and resource (useful if you often query by both) CREATE INDEX idx_attempts_user_resource ON attempts(user_id, card_id); CREATE INDEX idx_cards_resources ON cards_expressions(expression_id, card_id); -- CREATE TRIGGER IF NOT EXISTS populate_cards_resources -- AFTER INSERT ON cards -- FOR EACH ROW -- BEGIN -- -- Insert matching words into cards_resources -- INSERT INTO cards_expressions(card_id, expression_id) -- SELECT NEW.id, w.id -- FROM expressions w -- WHERE NEW.text LIKE '%' || w.spelling || '%'; -- END;