Если вытянуть данные ни через доктрину ни через чистый SQL

легко не получается, можно ли считать что я хреново спроектировал бд? Или это нормальная практика и просто надо рид модель заставлять работать не с бд, а с эластиком например?

У меня ситуация такая что есть базовые сущности и от них наследуются (или не наследуются, пробовал по разному) более конкретные типы, пример базовых сущностей (они abstract):
Channel{name, description}
ChannelPost{description}

и пример дочерних:
YoutubeChannel{..., videos: YtVideo[], followers: int, views: int}
TiktokChannel{..., videos: TtVideo[], followers: int, following, likes}
YtVideo {..., views, likes, dislikes, comments}
TtVideo {..., views, likes, comments}

И вот если мне надо получить список всех каналов (и ютуб, и тикток) и отсортировать их по кол-ву подписчиков DESC и отдать на фронтенд то с SQL или доктриной у меня получается что то вроде:

$allChannels = [...$ytChannels, ...$ttChannels];
usort($allChannels, fn ($ch1, $ch2) => $ch2->followers <=> $ch1->followers)
// todo map result to ChannelResource[] and return
то есть даже на простых требованиях, и даже если есть общие интерфейсы в этих сущностей уже возникают какие то трудности при выборке, не говоря про более сложные запросы вроде "вывести каналы в которых среднее кол-во просмотров на последних 5 видео более 100", напрашивается какой то индекс, смотрю в сторону эластиксерч.. я в правильную сторону двигаюсь или надо пересмотреть структуру бд в первую очередь?

Потому что у меня ощущение что я стою на месте, уже попробовал и через DiscriminatorMap, и просто отдельные интерфейсы вывести для Channel + ChannelPost и хранить всё в отдельных таблицах, думал так же о json полях, и сейчас пришел к тому что при записи всё настолько красиво что мне хотелось бы этот вариант оставить, но блин хочу удостовериться что смогу быстро считывать и мапить эти данные

3 ответов

11 просмотров

1. наследование сущностей "может быть не так уж плохо" когда весь стэйт private и наследники не имеют доступа к общим частям напрямую. Тут всеравно композиция работает лучше но "инфраструктура накладывает ограничения потому пойми и прости". Если это не так то это разные сущности и ты уже делаешь чернь. 2. ты не привел примеров запросов. Ощущение что ты вытаскиваешь всю базу и фильтруешь в php... с этой точки зрения "явно чет не так" и тут ничего про рид модель не надо даже упоминать. 3. то о чем ты говоришь это банальный репортинг и юзай для этого SQL. Возможно стоит разобраться какие фичи есть в SQL + вопрос еще какая СУБД. Какой-нибудь postgresql с задачами вида "выведи мне количество подписчиков по всем вот этим штукам" на SQL решается отлично.

V-S Автор вопроса
Sergey P
1. наследование сущностей "может быть не так уж пл...

1. Ну понятное дело что private, наследникам нет дела до родительских пропертей, с этим всё в порядке 2. Запросы вида SELECT id, subscribers FROM tiktok_channels WHERE owner_id = x UNION SELECT id, subscribers FROM youtube_channels WHERE owner_id = x- да в этом случае всю бд вытаскиваю ограничение только по каналах одного владельца, ну их не будет много (даже если 20) по этому сортировка на пхп, до более сложных вещей пока не дошел даже так как уже такая выборка сеет сомнения что я в правильном направлении двигаюсь 3. Субд постгрес последняя, да вот за напоминание про вюшки спасибо, надо в эту сторону посмотреть

V S
1. Ну понятное дело что private, наследникам нет д...

ну тип никто ж тебе не мешает делать... SELECT summary.id, summary.type, subscribers FROM ( SELECT id, 'youtube' as type, subscribers FROM ... UNION SELECT id, 'tiktok' as type, subscribers FROM ... UNION SELECT id, 'instagram' as type, subscribers FROM ... ) summary WHERE summary.subscribers > 100 ORDER BY summary.subscribers

Похожие вопросы

Обсуждают сегодня

Подскажите, а есть vault lite или ченить такое?) А то нужен вольт для похода в вольт, но весит он ~500 мб) как-то многовато для парочки запросов ))
Alexandr Orloff
17
Всем привет, есть небольшая проблема Есть такой скрипт document.addEventListener('DOMContentLoaded', function () { const sliderTabs = document.querySelectorAll('.s...
A da
8
@go1337 @dblackCat Привет. Все ещё дрочусь с fastpanel. Добавил второй домен который должен смотреть в рут того же сайта, но так как это просто домен, а не сайт, я не могу ему...
Ross 🦴
9
До речі, в ево нема можливості чи якого розширення щоб з адмінки з телефона зайти і терміново щось в верстці поправити?
Женя
7
кто-нибудь пользуется тайм-трекерами во время работы? так много разных нагуглил, может есть что-то популярное
Lencore
8
Пацаны. Я разрабатываю софт для инвайтинга на телетон, и столкнулся с такой проблемой, в один из чатов не могу приглашать никого, не дает добавлять, в то же время через официа...
Kernel Panic
11
Скажите, а кому нужен Currency как отдельный плагин вместо полноценного ecommerce в OctoberCMS? Кто-то использует его уже или планирует в будущем? Может я что-то не понимаю?
Igor
13
Розмовами про Рево мені нагадали часи, коли шаблони правилися прямо в адмінці. Хто в курсі, чому відійшли від цієї практики, так блейд не працює? Доволі зручно ж було (інколи)
Женя
3
Всем добрый вечер, Рад оказаться в кругу единомышленников. Начинаю погружаться в мир .net веба. Зовут Ерасыл 🖖 У меня назрел вопрос: Какой процент проектов, прошедшие через в...
Ерасыл
6
Чому? Да тому що без GiT не уявляю нормального проекта а коли код в базі то то так собі
Dmytro Lukianenko
3
Карта сайта