|
|
@ -4,6 +4,10 @@ CREATE TABLE "entry" ( |
|
|
|
"updatedAt" TIMESTAMPTZ DEFAULT now(), |
|
|
|
"userId" UUID NOT NULL REFERENCES "user"("id") ON DELETE CASCADE, |
|
|
|
"type" TEXT NOT NULL, |
|
|
|
"_type" TEXT[] GENERATED ALWAYS AS (CASE |
|
|
|
WHEN "type" = 'character' THEN ARRAY['character', 'hanzi', 'kanji'] |
|
|
|
ELSE ARRAY["type"] |
|
|
|
END) STORED, |
|
|
|
"entry" TEXT[] NOT NULL CHECK ("entry"[1] IS NOT NULL), |
|
|
|
"reading" JSONB NOT NULL DEFAULT '{}', -- TODO: jsonschema |
|
|
|
"translation" JSONB NOT NULL DEFAULT '{}', -- TODO: jsonschema |
|
|
@ -11,9 +15,14 @@ CREATE TABLE "entry" ( |
|
|
|
"tag" TEXT[] NOT NULL DEFAULT '{}', |
|
|
|
"level" FLOAT, |
|
|
|
"level.kanji" INT, |
|
|
|
"frequency" FLOAT, |
|
|
|
"key" TEXT UNIQUE, |
|
|
|
"_meta" JSONB, -- TODO: jsonschema |
|
|
|
"priority" INT GENERATED ALWAYS AS (CASE |
|
|
|
WHEN "type" = 'vocabulary' THEN 10 |
|
|
|
WHEN "type" = 'character' THEN 5 |
|
|
|
WHEN "type" = 'sentence' THEN 1 |
|
|
|
ELSE 0 |
|
|
|
END) STORED, |
|
|
|
PRIMARY KEY ("id") |
|
|
|
); |
|
|
|
|
|
|
@ -22,12 +31,13 @@ CREATE TRIGGER "t_entry_updatedAt" |
|
|
|
FOR EACH ROW |
|
|
|
EXECUTE PROCEDURE "f_updatedAt"(); |
|
|
|
|
|
|
|
CREATE INDEX "idx_entry_priority" ON "entry" ("priority"); |
|
|
|
|
|
|
|
CREATE INDEX "idx_entry_updatedAt" ON "entry" ("updatedAt"); |
|
|
|
CREATE INDEX "idx_entry_userId" ON "entry" ("userId"); |
|
|
|
CREATE INDEX "idx_entry_type" ON "entry" ("type"); |
|
|
|
CREATE INDEX "idx_entry_type" ON "entry" USING GIN("_type"); |
|
|
|
CREATE INDEX "idx_entry_level" ON "entry" ("level"); |
|
|
|
CREATE INDEX "idx_entry_level.kanji" ON "entry" ("level.kanji"); |
|
|
|
CREATE INDEX "idx_entry_frequency" ON "entry" ("frequency"); |
|
|
|
|
|
|
|
CREATE INDEX "idx_entry_description" ON "entry" |
|
|
|
USING pgroonga("description") |
|
|
|