Доброго времени суток, делаю небольшой Pet-проект и возникли затруднения, связанные с проектированием БД и написанием эффективных SQL-запросов, перейду сразу к сути:
Использую PostgreSQL, имеется следующий список таблиц:
Псевдокод на dbdiagram.io
// Таблица с аккаунтами
Table accs {
id int [pk, increment]
}
// Таблица с магазинами
Table shops {
id int [pk, increment]
}
// Таблица с товарами аккаунтов
Table accs_products {
id int [pk, increment]
owner_acc_id int [ref: > accs.id]
name text
product_uniq_field_first text
}
// Таблица с товарами магазинов
Table shops_products {
id int [pk, increment]
owner_shop_id int [ref: > shops.id]
name text
product_uniq_field_second text
}
// Таблица с избранными аккаунтами для каждого аккаунта
Table favourite_accs_for_accs {
acc_id int [ref: > accs.id]
fav_acc_id int [ref: > accs.id]
}
// Таблица с избранными магазинами для каждого аккаунта
Table favourite_shops_for_accs {
acc_id int [ref: > accs.id]
fav_shop_id int [ref: > shops.id]
}
Краткое описание назначения таблиц и логики:
В системе есть аккаунты и магазины(accs и shops), которые могут размещать у себя товары(accs_products и shops_products), то есть аккаунты и магазины представляют из себя 2 типа магазина.
Также аккаунты могут добавлять эти самые разные площадки(магазины и аккаунты) в избранное, чтобы потом в общей ленте смотреть все товары разных типов магазинов(favourite_accs_for_accs и favourite_shops_for_accs).
Товары аккаунтов и магазинов похожи и имеют общие поля(name), но при этом у товаров магазинов и аккаунтов есть и свои уникальные поля(product_uniq_field_first и product_uniq_field_second). И таких отличающихся полей может быть как 5, так и 10.
Помимо этого, может быть такая ситуация, что кроме товаров аккаунтов и магазинов, появятся товары ещё одной отдельной сущности, например, групп(groups, groups_products, favourite_groups_for_accs) -- третий тип магазинов.
Конкретные вопросы:
1. Как правильнее будет спроектировать таблицы в БД? Создать одну единую таблицу для всех продуктов всех типов магазинов с кучей опциональных NULL-полей или же на каждый тип магазина по отдельной таблице, как сейчас?
2.
Ключевой: исходя из вопроса выше, как должен выглядеть правильный SQL-запрос(PostgreSQL или аналогия в MySQL) по best practices на получение товаров разных типов магазинов(которые есть у аккаунта в избранных в двух таблицах
favourite_accs_for_accs и
favourite_shops_for_accs) с пагинацией(со строгим количеством элементов на странице) в том или ином случае?
Никак не могу продумать этот момент, очень надеюсь на Вашу помощь, заранее благодарю.