我需要实现这个数据结构(我正在使用PostgreSQL 9.5):
images
可以位于任何Collection
和Groups
的根目录中。
必须在父Groups
的上下文中对Images
和Group/Collection
进行排序。
我有以下表格(我准备以任何方式更改它们以获得最佳结果):
CREATE TABLE Collections (
col_id SERIAL PRIMARY KEY,
col_name VARCHAR(100)
);
CREATE TABLE Groups (
group_id SERIAL PRIMARY KEY,
group_collection INT REFERENCES Collections (col_id) ON DELETE CASCADE,
group_name VARCHAR(100),
group_index SERIAL -- Index of group in a collection
);
CREATE TABLE Images (
image_id SERIAL PRIMARY KEY,
image_collection INT REFERENCES Collections (col_id) ON DELETE CASCADE,
image_group INT REFERENCES Groups (group_id) ON DELETE CASCADE,
image_url VARCHAR(512),
image_index SERIAL -- Index of image in a group
);
SELECT
任何Collection的内容都没有问题,但我在添加,删除和重新排序Images
和Groups
时遇到问题。当然我想在任何Group/Collection
中保留唯一索引(排序)(顺序可以像[1,4,10]那样有任何中断,但不能有重复的值,如[1,1,3])。
使用示例数据进行更新。以下是sqlfiddle的示例数据和查询链接。我正在使用这个SELECT
请求,它没问题(它给了我所需的输出):
SELECT
Groups.*,
json_agg(Images.*) as images
FROM Groups
RIGHT JOIN Images
ON Groups.group_id = Images.image_group
WHERE Groups.group_collection = 1 OR Images.image_collection = 1
GROUP BY Groups.group_id;
我的主要问题是重新排序Images
(特别是将Image
从一个Group
移动到一个特定的地方转移到另一个Group
)。
注意!对于(可能) order 和 group 的相交概念感到抱歉,因为SQL世界也有这些概念,但我不知道如何用其他词语说出同样的事情。