Мои данные состоят из книг, которым можно назначить несколько категорий (ужасы, драмы, комедии и т. Д.).Пользователи могут подписаться на категорию, и я хочу иметь возможность выполнять постраничные запросы к таблице книг для всех книг, которые имеют указанную категорию.Пример схемы:
CREATE TABLE IF NOT EXISTS books (
bookid uuid PRIMARY KEY,
categories uuid[],
name text,
author text,
releasedate timestamp
);
CREATE TABLE IF NOT EXISTS categories (
categoryid uuid PRIMARY KEY,
name text
);
CREATE TABLE IF NOT EXISTS users (
userid uuid PRIMARY KEY,
name text
);
CREATE TABLE IF NOT EXISTS catsubscribers (
categoryid uuid REFERENCES categories,
userid uuid REFERENCES users,
PRIMARY KEY (categoryid, userid)
);
CREATE TABLE IF NOT EXIST bookcats (
bookid uuid REFERENCES books,
categoryid uuid REFERENCES categories,
PRIMARY KEY (bookid, categoryid)
);
CREATE OR REPLACE FUNCTION getBooksBySubscribedCategory(me uuid, ofst integer, lim integer)
RETURNS TABLE(bookid uuid, categories uuid[], name text, author text, releasedate timestamp) AS $$
DECLARE cid RECORD;
BEGIN
FOR cid IN (SELECT categoryid FROM catsubscribers WHERE userid = me)
LOOP
RETURN QUERY SELECT bks.bookid, bks.categories, bks.name, bks.author, bks.releasedate
FROM (SELECT bookid, categories, name, author, releasedate FROM books WHERE bookid IN (SELECT bookid FROM bookcats WHERE categoryid = cid ) AS bks
ORDER BY releasedate DESC
OFFSET ofst
LIMIT lim;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
Эта функция возвращает массив категорий, на которые подписан пользователь, и циклически перебирает каждую категорию и запрашивает книги в таблице соединений bookcats.Это моя первая попытка грубой силы - уродливая, и я не уверен, что из-за петли правильная нумерация страниц выполняется правильно.Есть ли лучший способ сделать это?