Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 1
Регистрация: 27.06.2013
Сообщений: 88

JSON запросы - насколько эффективны

17.03.2025, 10:53. Показов 1270. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте ребята. Я хотела спросить у вас совета и послушать мнения опытных программистов.
В MSSQL есть возможность вернуть результаты запроса в виде JSON. Мне это очень понравилось. Так как мне удобно получить такой json и десерилизовать его в нужный объект. Т.е. получается мне возвращается в ответ json строка и я её десерелизую в объект на C#. Приведу маленький пример кода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        public LotWithApplication GetInfoByLotWithApplicationsForUser(int lotId, int companyId, ref string error)
        {
            LotWithApplication lot;
            Log.Information(string.Format("exec GetInfoByLotWithApplicationsForUser {0}, {1} ", lotId, companyId));
 
            try
            {
                string query = string.Format("exec [GetInfoByLotWithApplicationsForUser] {0}, {1}", lotId, companyId);
                string json = string.Concat(_mithraContext.Database.SqlQueryRaw<string>(query));
                lot = JsonSerializer.Deserialize<LotWithApplication>(json);
            }  
            catch (Exception ex)
            {
                Log.Error(ex, "GetInfoByLotWithApplicationsForUser exception: " + ex.Message);
                error = "GetInfoByLotWithApplicationsForUser exception: " + ex.Message;
                return null;
            }
            return lot;
        }
Мне удобно получив в такой модели данные передать их сразу во вьюшку на react.
У нас в проекте использовался немного другой подход. Разные способы мы использовали.
Другому программисту почему-то не очень понравилась моя идея. Он видит здесь излишенюю нагрузку на то что данные сначала серелизовались потом десерилизовались. Возможно это и так. Но если писать запрос по-другому, то придётся скорее всего использовать операторы group by, order by. И вот я не знаю что было бы наилучшим решением ?
Я так же услышала что смутило что я сразу получила из БД данные в одну модель и эту же самую модель вернула в react.
А другой программист больше любит делать по-другому. Он очень любит EntityFramework CodeFirst. И старается получить данные в основном посредством него. Я заметила что в запросах используется много Include вызовов, это по сути join на таблицу. И получается что мы получаем объект таблицы из БД (класс который мы создавали в code first под таблицу), далее передаём её некоторой фабрики, которая через разные связи в объектах пытается получить нужные оставшиеся данные.
Т.е. мы всё равно посылаем запросы к БД на получение данных, пусть даже и через Entity Framewrok.
И вот я хотела бы почитать мнения опытных разработчиков.
Есть и ещё вопрос, на который хотелось бы тоже послушать мнения.
Я работала как-то над большим проектом в команде. Я помню что там тоже любили entity framework code firsrt. Но потом постепенно ушли от подхода code first к подходу database first. Мы писали много хранимых процедур, у нас были тригерры на таблицах. И работало с нами несколько человек именно программистов баз данных. И вот я как-то в голове себе уложила, что
база данных очень серьезная вещь в проекте, и когда нам важны там данные, т.е. мы не можем позволить себе её удалять и пересоздавать заново, то подход databae first мне нравится больше. Мне нравится когда мы не полагаемся на то как за нас entity framework организует данные, не работаем как бы с БД с закрытыми глазами, а сами продумываем схему таблиц, связи, как мы и что будем хранить. Мне понравилось когда мы стараемся хранимыми процедурами получить как можно больше данных чтобы потом не получать их через коллекции и другие связанные таблицы в коде C# уже. Мне кажется что СУДБ очень серьезная вещь в проекте и лучше чтобы мы хорошо знали как она работает, как что устроено, как грамотно и оптимально писать SQL-запросы.
Я как-то не могу положиться на то что за меня код напишет лучше библиотека entity framework. Я люблю подумать, поанализировать как лучше получить данные. И мне даже понравилось что можно получить данные в json и без фабрик передать эту же модель в react. Потому как моя модель не сущность таблицы в БД. И я избегаю лишних как мне кажется моделей данных.
Но меня часто убеждают что подход code first самый лучший и что можно не задумываться как там запросы пишутся им, что это крутая библиотека и можно на неё положиться. Мне кажется что подход code first больше придуман для тех кто почти ничего не знает о базах данных и совсем не владеет SQL, и плюс к этому ему не важно, если его БД удалится и будет пересоздаваться.
Как бы данные в БД для него не на первом месте и потеря их не критична.
Мне бы хотелось послушать мнения по поводу подходов code first и database first.
Напоследок приведу мой запрос к БД, который возвращает данные в виде json:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
ALTER PROCEDURE GetInfoByLotWithApplicationsForUser (@lotId int, @companyId int)
AS
BEGIN
 
declare @applicationJSON nvarchar(max)
set @applicationJSON = (Select app.Id, 
    StatusId,
    app.CreationDate, 
    SendDate,
    case app.SignedData
    WHEN NULL
    THEN cast(0 as bit)
    ELSE cast(1 as bit)
    END as 'IsSigned',
    Documents.Id,
    Documents.Name,
    Documents.Comment,
    Documents.DocumentTypeId as 'DocumentType',
    Documents.Path,
    Documents.MimeType,
    CASE Documents.SignedData
            WHEN NULL 
            THEN cast(0 as bit)
            ELSE cast(1 as bit)
            END as 'IsSignatureVendor'
    from TradeApplication app
    inner join DocumentTradeApplication dt on dt.ApplicationsId = Id
    inner join Document Documents on Documents.Id = dt.AttachmentsId
    where app.TradeLotId = @lotId and app.CompanyId = @companyId 
    for json AUTO, WITHOUT_ARRAY_WRAPPER)
 
    select cast((Select lot.Id,
    lot.Name, 
    comp.Name as 'CompanyName',
    comp.Id as 'CompanyId',
    acc.Id as 'AccountId',
    lot.TradeTypeId as 'TradeTypeId',
    (Select StatusId from TradeApplication where TradeLotId = lot.Id and CompanyId = @companyId) 'TradeApplicationStatus',
    lot.Information,
    lot.BasePrice,
    lot.CurrentPrice,
    lot.BuyNowPrice,
    lot.StepValue,
    lot.StepPercent,
    lot.DepositSize,
    lot.TradePeriodLength,
    lot.LotTradePeriodStart,
    lot.LotTradePeriodEnd,
    lot.LotApplicationPeriodStart,
    lot.LotApplicationPeriodEnd,
    JSON_QUERY(@applicationJSON) as [Application],
    CASE when exists(SELECT id, Price
                      FROM LotPrice
                      WHERE Price = (SELECT MAX(Price) FROM LotPrice where LotId = lot.Id) and CompanyId = @companyId and lot.LotTradeStateId = 37)
      THEN cast(1 as bit)
      ELSE cast(0 as bit)
      END as 'IsWinner',
    CASE when exists(SELECT id
                      FROM Favorites
                      WHERE LotId = lot.Id and UserId = acc.Id)
        THEN cast(1 as bit)
        ELSE cast(0 as bit) 
      END as 'IsHasFavorites',
    CASE when exists(SELECT id
                      FROM AccountSubscriptions
                      WHERE UserId = acc.Id and SubscribedCompanyId = @companyId)
        THEN cast(1 as bit)
        ELSE cast(0 as bit) 
      END as 'IsSubscribed',
    (Select doc.Id,
            doc.AccountId as 'OwnerAccountId',
            doc.Name, 
            doc.Comment,
            doc.Path,
            doc.DocumentTypeId as 'DocumentType',
            CASE SignedData
            WHEN NULL 
            THEN cast(0 as bit)
            ELSE cast(1 as bit)
            END as 'IsSignatureVendor',
            CASE WinnerSignedData
            WHEN NULL 
            THEN cast(0 as bit)
            ELSE cast(1 as bit)
            END as 'IsSignatureWinner',
            doc.SignDate as 'DateSignVendor', 
            doc.SignedData,  
            CreationDate,
            MimeType 
        
      from DocumentTradeLot 
      inner join Document doc on doc.Id = AttachmentsId
      where LotsId = lot.Id 
    for json path) [Documents],
 
    (Select Id, FileName, DisplayNumber, Url, ContentType 
    from MediaFile 
    where TradeLotId = lot.Id order by DisplayNumber 
    for json path) [Pictures],
 
    (Select f.Name as 'FilterName', lf.Value, fg.Name as 'GroupName'
    from Filters f
    inner join LotFilterValues lf on lf.FilterId = f.Id and lf.LotId = lot.Id
    inner join FilterGroups fg on fg.Id = f.FilterGroupId
    for json path) [Filters]
 
    from TradeLot lot 
    inner join Company comp on comp.Id = lot.OrganizerId
    inner join Account acc on acc.CompanyId = comp.Id
    where lot.Id = @lotId
    for json path, WITHOUT_ARRAY_WRAPPER) AS VARCHAR(MAX)) AS JSONDATA
END
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.03.2025, 10:53
Ответы с готовыми решениями:

Вывести запрос в формате json
Добрый день. Как или чем можно сформировать json результат выборки запроса для вывода в формате { &quot;field_1&quot;: ...

Запрос, получение элементов массива из JSON
Есть колонка в таблице, там хранится JSON формата Нужен SELECT по этой колонке, который будет осуществлять поиск по подстроке и...

Вернуть запрос из базы данных в формате json
Привет. У меня есть БД на PostgreSQL. Она содержит ряд таблиц имеющие разное количество полей. Далее, создан проект Flask на Python. ...

6
Эксперт .NET
 Аватар для Usaga
14072 / 9289 / 1347
Регистрация: 21.01.2016
Сообщений: 34,872
17.03.2025, 10:57
Цитата Сообщение от tiny developer Посмотреть сообщение
Мне удобно получив в такой модели данные передать их сразу во вьюшку на react.
Т.е. база возвращает данные в виде подогнанном под UI? Зачем тогда надо десериализовывать строку, когда её можно так и отдать?
0
0 / 0 / 1
Регистрация: 27.06.2013
Сообщений: 88
17.03.2025, 11:22  [ТС]
там не совсем все поля подогнаны под UI, есть ещё 3-4 поля которые нужно обработать и записать туда значения нужные.
Вот я их обрабатываю и возвращаю эту модель в UI. Можно правда и на UI сделать эту обработку полей.
Вы думаете это хорошо будет ?
Почему-то другого программиста очень смущает что я данные сразу в UI отдаю... он говорит что это не очень правильно...
0
Эксперт .NET
 Аватар для Usaga
14072 / 9289 / 1347
Регистрация: 21.01.2016
Сообщений: 34,872
17.03.2025, 11:49
tiny developer, ну тогда это действительно выглядит избыточно. Лишняя работа для базы.

Основный смысл сего действия в чём? В удобной материализации выборки? Если так, то почему бы не использовать какой-нибудь Dapper?
0
0 / 0 / 1
Регистрация: 27.06.2013
Сообщений: 88
17.03.2025, 13:38  [ТС]
Dapper как я прочитала это аналогичная библиотека как entity framework. Но у меня есть небольшой вопрос.
Ведь библиотека получив результат запроса, тоже выполняет какую-то его обработку чтобы представить его нам в виде того объекта который мы хотим получить и передаём в качестве шаблона. Это тоже некоторая работа, как например и десерелизация результат json в объект. Не является ли всё это очень похожей работой ?
Не совсем понимаю до конца, почему лишняя работа для БД ? Ведь Dapper или entity framework так же посылают внутренние запросы к БД когда вы запрашиваете данные связанных таблиц, коллекций и виртуальных полей. Вы просто этого не видите как SQL-код, за вас это делает автоматически библиотека. И я не понимаю до конца в чём преимущества ? В удобстве или привычке программиста ?
0
1302 / 356 / 97
Регистрация: 14.10.2022
Сообщений: 1,084
17.03.2025, 15:29
Цитата Сообщение от tiny developer Посмотреть сообщение
Мне бы хотелось послушать мнения по поводу подходов code first и database first.
Всё зависит от размена данных, которыми вы оперируете, и от этих операций с данными, как таковых.
По моему мнению, подход code first полностью и абсолютно неработоспособен, как только ваши данные становятся хоть сколько-нибудь велики.
Экстремальный пример: когда у вас, в основных таблицах уже пара-тройка миллиардов записей, иногда приходится сурово поднапрячься, чтобы даже простые запросы хоть как-то работали. Докапываться до нюансов.
Разумеется, entity framework очень сильно подрос за истекшие 10 лет, с т.з. оптимальности генерации запросов к БД, но, опять же, на мой взгляд, до сих пор не предназначена для оперирования данными, хоть со сколько-нибудь отличными от 0 объемами.
И, кстати, проектам, написанным в подходе code first очень трудно (не буду писать - невозможно, "очень трудно") помочь при возникающих проблемах с производительностью DBA-шными методами. По крайней мере, проблемы DBAшников вырастают на пару порядков.
Разумеется, опять же оговариваюсь, если речь идет о сколь-нибудь заметном объеме данных хранящихся в БД и сколь-нибудь отличном от 0 количестве сущностей, описанных в БД.
Мой личный опыт показывает, что там, где ожидается больше 100 млн. записей в основных таблицах, и количество сущностей переваливает за пару-тройку сотен - возможен только database first подход, иначе проблемы производительности не удается решить никаким силами.
Но, опять же хочу сказать, что всё сильно шагнуло вперед, возможно уже миллиард/тысячу переварит.

Ко второму:
Цитата Сообщение от tiny developer Посмотреть сообщение
Напоследок приведу мой запрос к БД, который возвращает данные в виде json:
Да, такое, не хочется употреблять слово "извращение", употреблю слово "подход" - имеет место быть.
У него есть очень большой недостаток: его катастрофически сложно сложнее поддерживать, отлаживать и сопровождать.
Да и написание кода на стороне БД тоже становится несколько сложнее (хотя, не принципиально).
В смысле сопровождения программистом (не DBA, а именно программописателем) - лучше уж возня с энтити фреймворк.
Этот подход, по крайней мере, более контролируем и подвержен общим правилам и типовым решениям.

На мой взгляд - это паллиатив code first подхода, который хуже и классического code first и классического database first, с запросами-хранимками, возвращающими классические наборы записей (которые да, потом приходится оборачивать отдельным слоем абстракции).

В общем, для наколенных поделок - энтити фреймфорк, для сурового энтерпрайза - только хардкор, классические ХП и все манипуляции данными средствами SQL-сервера, а за попытку вернуть на клиента/в приложение что-нибудь массивнее 10 записей - расстрел на месте.
Только так, только хардкор!

... Флейма для, конечно...
:-))))
1
Эксперт .NET
 Аватар для Usaga
14072 / 9289 / 1347
Регистрация: 21.01.2016
Сообщений: 34,872
17.03.2025, 15:41
Цитата Сообщение от uaggster Посмотреть сообщение
Разумеется, entity framework очень сильно подрос за истекшие 10 лет, с т.з. оптимальности генерации запросов к БД, но, опять же, на мой взгляд, до сих пор не предназначена для оперирования данными, хоть со сколько-нибудь отличными от 0 объемами.
Я противник EF'а, но тут что-то странное написано, как мне кажется) Code First \ Database First - это не про подход к запросам, а про как сущности описываются (база создаётся по сущностьям, или сущности по базе).

На EF можно писать более-менее хорошие запросы на чтение. Но сама Microsoft в своей документации этому не учит.

Цитата Сообщение от uaggster Посмотреть сообщение
В общем, для наколенных поделок - энтити фреймфорк, для сурового энтерпрайза - только хардкор, классические ХП и все манипуляции данными средствами SQL-сервера, а за попытку вернуть на клиента/в приложение что-нибудь массивнее 10 записей - расстрел на месте.
Только так, только хардкор!
У нас на работе суровый энтерпрайз. Около 500 таблиц. Тонны запросов. И были раньше хранимки (видимо любимый подход в энтерпайзе). Избавились от них в пользу EF'а. Писать стало сильно проще, но тормозило. А потом пересмотрели подход и стали запросы (на EF) писать с умом. И стало весьма хорошо. А потом заменили EF на Linq2Db, который дал больше простора в написании запросов и всё вообще залетало.

Поэтому тут фанатизма не надо) Надо уметь пользоваться инструментом)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.03.2025, 15:41
Помогаю со студенческими работами здесь

Аналитический запрос для определения эффективности рассылок
Необходимо оценить эффективность маркетинговых рассылок, упрощенная схема бд приведена на картинке. Считаем единичное уведомление...

Как получить json с несколькими вложенными массивами посредством запроса к нескольким таблицам
Добрый день! Очень прошу помочь, всю голову сломала)) Мне нужно на выходе получить json вида: `, &quot;doing&quot;: ...

Запрос, который из строк преобразует в json и обратно
Здравствуйте Есть такой запрос, который из строк преобразует в json и обратно. CREATE TYPE test.myType1 AS (&quot;name&quot;...

Насколько эффективны онлайн курсы?
Всем привет. Подскажите, кто изучал по онлайн курсам и сейчас сможет сказать, что это действительно эффективное вложение денег и времени?...

JSON запросы на https url
Ребята, подскажите, что делать json запросы из php скрипта не уходят, если урл указан https:// на http:// норм


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru