Если вытянуть данные ни через доктрину ни через чистый 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 ответов

18 просмотров

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

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

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

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Ребят, подскажите, пожалуйста, почему в префиксе к ассетам, которые генерируются через фильтр | theme в шаблоне, стал вдруг появляться index.php? Вот так выглядит ссылка на а...
Виталий
1
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Коллеги, может знает кто, можно ли цвет бейджа счётчика в BackendMenu менять без бубнов?
Alex Blaze
3
Карта сайта