【发布时间】:2014-09-10 07:31:26
【问题描述】:
我有一组Item-s,每个人都有一组Tag-s。我想要一个 DB SELECT,对于这些项目的一些(大)子集,返回该 Item 子集中每个 Tag 的总数。
有没有办法使用 PostgreSQL 9.3 / 9.4 数组运算符来做到这一点?
我的计划B是有一个单独的表Tags和多对多链接表Item_Tags,然后做一个:
CREATE TABLE "Tags" (
"Name" character varying,
id uuid NOT NULL,
CONSTRAINT id PRIMARY KEY (id)
);
CREATE TABLE "Items" (
id uuid NOT NULL,
data character varying,
CONSTRAINT "Items_pkey" PRIMARY KEY (id)
);
CREATE TABLE "Item_Tags" (
tag_id uuid,
item_id uuid,
id uuid NOT NULL,
CONSTRAINT "Item_Tags_pkey" PRIMARY KEY (id),
CONSTRAINT "Item_Tags_item_id_fkey" FOREIGN KEY (item_id)
REFERENCES "Items" (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT "Item_Tags_tag_id_fkey" FOREIGN KEY (tag_id)
REFERENCES "Tags" (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);
Select "Tags"."Name", count(*)
From "Tags"
Join "Item_Tags" on "Tags"."id" = "Item_Tags"."tag_id"
Join "Items" on "Items"."id" = "Item_Tags"."item_id"
Where "Items"."data" in ('a', 'b', 'c', 'd', 'e') -- replace with actual criteria
Group By "Tags"."Name"
有没有更好的办法?
假设Items 和Tags 表都很大(分别为数亿和数百万项),是否有任何特殊索引可以帮助提高效率?
如果我想要所有标签的计数(不过滤),我应该只创建一个视图并使用它吗?
【问题讨论】:
标签: sql postgresql database-design many-to-many aggregate-functions