64 lines
2.4 KiB
SQL
Executable File
64 lines
2.4 KiB
SQL
Executable File
CREATE TABLE "entry" (
|
|
"id" UUID NOT NULL DEFAULT uuid_generate_v4(),
|
|
"createdAt" TIMESTAMPTZ DEFAULT now(),
|
|
"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
|
|
"description" TEXT NOT NULL DEFAULT '',
|
|
"tag" TEXT[] NOT NULL DEFAULT '{}',
|
|
"level" FLOAT,
|
|
"level.kanji" INT,
|
|
"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")
|
|
);
|
|
|
|
CREATE TRIGGER "t_entry_updatedAt"
|
|
BEFORE UPDATE ON "entry"
|
|
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" 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_description" ON "entry"
|
|
USING pgroonga("description")
|
|
WITH (plugins='token_filters/stem', token_filters='TokenFilterStem');
|
|
|
|
CREATE INDEX "idx_entry_entry" ON "entry"
|
|
USING pgroonga("entry")
|
|
WITH (
|
|
tokenizer='TokenMecab',
|
|
normalizer='NormalizerNFKC100("unify_kana", true)'
|
|
);
|
|
CREATE INDEX "idx_entry_entry_gin" ON "entry" USING GIN("entry");
|
|
CREATE INDEX "idx_entry_tag" ON "entry" USING pgroonga ("tag");
|
|
|
|
CREATE INDEX "idx_entry_meta" ON "entry" USING pgroonga("_meta");
|
|
CREATE INDEX "idx_entry_reading" ON "entry"
|
|
USING pgroonga("reading")
|
|
WITH (
|
|
tokenizer='TokenMecab',
|
|
normalizer='NormalizerNFKC100("unify_kana", true)'
|
|
);
|
|
CREATE INDEX "idx_entry_translation" ON "entry"
|
|
USING pgroonga("translation");
|