Dr. Friedrich
Вот только я в GraphQL не совсем понимаю прикол, получается вместо одного запроса с JOIN мы просто делаем 100500 запросов
Отакже я не вижу, как GraphQL продуцирует у тебя 100500 запросов. Вроде бы основной поинт был как раз обратный.
Dr. Friedrich
Подумой! Возможно, ты что-то делаешь не так!
Dr. Friedrich
Вот вам история от человека, который точно что-то делает не так ↓
Dr. Friedrich
https://workplace.stackexchange.com/questions/131948/did-i-make-a-mistake-by-ccing-email-to-boss-to-others > My personal life is chaotic as my teenage son has autism/ADHD, I have depression, my teenage daughter has anxiety/depression and my wife has unspecified/undiagnosed mental health issues. She has mentioned feeling suicidal to me several times and gets no real help. The environment at home is physically and mentally chaotic, with frequent crises and lots of extreme stress.
Dr. Friedrich
И теперь мои проблемы мне не кажутся такими уж значительными…
Nikolay
Отакже я не вижу, как GraphQL продуцирует у тебя 100500 запросов. Вроде бы основной поинт был как раз обратный.
Ну смотри, например такая структура: public class Dealer { public int DealerId { get; set; } public ICollection<User> Users { get; set; } } Получается, мы тащим 100 Dealer'ов, и нам нужно сделать 100 запросов DealerId, если в GraphQL попросили получить юзера
Dr. Friedrich
> мы тащим 100 Dealer'ов, и нам нужно сделать 100 запросов DealerId Почему?
Nikolay
Хотя тут точно не уверен, может и DataLoader оптимизирует это и сделает один Fetch
Dr. Friedrich
Разве нельзя сделать запрос с тем же in?
Dr. Friedrich
Передайте что я протев такой фигни
Nikolay
Хотя тут точно не уверен, может и DataLoader оптимизирует это и сделает один Fetch
Т.е. получится такой запрос: select User.* from Dealer join User on User.DealerId = Dealer.DealerId where DealerId in (1,2,..100)
Nikolay
Ну допустим. Почему это плохо?
Если тащишь больше тысячи
Dr. Friedrich
Ну, если тебе нужно такую инфу загрузить, я не вижу более хорошего способа с точки зрения SQL.
Dr. Friedrich
Если тащишь больше тысячи
А зочем тебе больше тысячи?
Dr. Friedrich
Это уже клиент должен соображать
Nikolay
В оракле, например, больше 1000 по дефолту нельзя
Dr. Friedrich
Смешно
Nikolay
А зочем тебе больше тысячи?
Ну вот мы иногда генерируем огромные отчёты, и там сотни тысяч строк выгружается
Dr. Friedrich
Но таки да, есть такое
Nikolay
Ну вот не точно)
Dr. Friedrich
2. Это точно проблема? Обычно отчёты генерируются не очень часто, и мб даже со специальной ридонли отчётной реплики
Nikolay
Ну этот вариант вообще применим, если GraphQL DataLoader работает так, как я думаю
Dr. Friedrich
Я не понел, при чём тут какой-то GraphQL DataLoader.
Dr. Friedrich
У тебя есть запрос, и тебе нужно по нему вернуть данные
Dr. Friedrich
Дальше уже не твоя забота. Если клиент запросил слишком овердофига — он сам и виноват
Dr. Friedrich
Ты можешь, конечно, попробовать с порога посылать нахер таких клиентов
Dr. Friedrich
Ну чтоб не досили сервер
Dr. Friedrich
Но ему в любом случае придётся у себя запрос переписать, если он не может его результаты переварить, так?
Nikolay
Тащить пачками
Roman
habib
Т.е. получится такой запрос: select User.* from Dealer join User on User.DealerId = Dealer.DealerId where DealerId in (1,2,..100)
@Dolfik если прямо вот так надо. я делал следующим образом: выгружал идентификаторы в темп таблицу и в contains обращался к ней: select * from User where User.Id in (select Id from #tempUser)
Nikolay
Исходники EF прекрасны
habib
ну, я его научил)
habib
var ids = context.Users.Where(....).AsTemp(); var query = context.Dealers.Where(dealer => ids.Contains(dealer.UserId))
habib
типа того
habib
и притом это EF6
Nikolay
Прикольно, не знал даже про такое
habib
моу код скинуть
habib
правда это еще тот костыль
habib
но работает
Nikolay
Кидай, мб пригодится)
habib
https://gist.github.com/habib-sadullaev/7a733dbf28b8faca4e5fc777091fd3ab
habib
и нужно заглушку для темповой таблицы сделать
habib
ну, чтоб при ее появлении контекст мог ее увидеть
Nikolay
habib
ms sql
habib
если ты об этом
Nikolay
Я вижу ты обычные таблицы используешь
Nikolay
Просто в оракле есть специально для этого временные таблицы, в mssql скорее всего тоже
Nikolay
Они даже на диск вроде не пишутся, просто в памяти лежат
habib
ну, в еф6 без таких ухищрений не обойтись
habib
я подозреваю, в еф-коре больше возможностей
habib
вот в нее и записывается
habib
там спей база есть
habib
TempDb
habib
кажись
habib
в ms sql
Nikolay
Не, там суть в том, что ты temporary создаёшь также, как и обычные
Nikolay
CREATE GLOBAL TEMPORARY TABLE {temp}(id NUMBER);
Nikolay
Типа так
habib
а
habib
в мс сиквеле по-другому
habib
но суть таже
Nikolay
А в Oracle 18c можно сделать вообще таблицу на сессию
habib
она в рамках одного соединения создается
habib
и удалается автоматом
habib
одно подключение, его держишь открытым, чтобы она, это темп таблица была доступна на протяжении всего запроса, пока контекст жив
habib
ну, обычно, одно подключение на один запрос
habib
так что не вижу проблемы
habib
в зависимости от сценария, можно немного переделать в класс с IDisposable
habib
и через using указывать скоуп
Vasiliy
https://www.theverge.com/platform/amp/circuitbreaker/2019/3/19/18273461/google-stadia-cloud-gaming-service-controller-hands-on-gdc-2019
вообще классная штука. Надо, конечно, смотреть на монетизацию сервиса. А так уже все крупные игроки ударились в облачный гейминг. Сони. МС и вон теперь еще и Гугл. Интересно, как будет сони делать, ибо у гугла и МС есть уже давно свои сервера по миру, а вот у сони заметно меньше их. И Знаете что самое веселое? то что обланый гейминг уже был. Помню ах 2008-10 я был сказал, как раз когда выходил Crysis и все остально и все такие мы представим вам будущее облачный гейминг, где даже кризис пойдем на максималках. Я о том, что большинство новых идей в IT как то начинают работать только во второе пришествие. Аналогично с ВР.