Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
LightN
Member

Откуда: Москва
Сообщений: 189
Есть торговая система. В 100-не разных мест нужны итоговые суммы. Например, имеем dbo.Invoices (счёт), у счёта есть его позиции dbo.Invoice_Detailes.
В dbo.Invoice_Detailes добавляем, вставляем, меняем записи, перебрасываем записи из счёта в счёт, меняем цены, кол-ва и т.д. В этой одной структуре желательно уже иметь набор Итоговых суммы, которые хотелось для усиления производительности положить как готовые поля в dbo.Invoices. Это и Total_UE, Total_RUB, Total_QTY и т.д.
1. Правильно это или нет, что всё это контролируется с помощью TRIGGER-ов. Записей в dbo.Invoices >10 000 и итоговые суммы нужны потом на уровне VIEW почти в 400-разных местах. Соответственно dbo.Invoice_Detailes > 100 000 записей.
2. В новых версиях MSSQL появилась возможность задать прямо на уровне CREATE TABLE поле-функцию. Т.е. создаем скалярную функцию, например, такую, которая считает Total_QTY (кол-во позиций в счёте) и всё. И прямо в таблице определяем поле Total_QTY = fTotal_QTY(InvoiceID)
3. Остается ещё и старый способ. Это VIEW с группировкой и далее всегда смотреть на неё.
Вопросы:
а) Какой способ и в каких случаях правильно использовать?
б) Если это вариант TRIGGER, то оптимально это делать в одном месте (INSERT, UPDATE, DELETE,) или разбить на 3, т.е. свой на TRIGGER на INSERT, свой на UPDATE, свой на DELETE ? (В проекте часто используется другие TRIGGER-а с after delete, update, insert).
в) В каких случаях нужно использовать вариант VIEW и только.
22 июл 16, 14:02    [19441502]     Ответить | Цитировать Сообщить модератору
 Re: Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
правильно писать бизнесс логику на хранимых процедурах +держать поле в таблице (можно и вычисляемое)
а вешать все на тригерра или вью - ИМХО неправильно. Нахрена сервер напрягать лишними вычислениями.
22 июл 16, 14:11    [19441568]     Ответить | Цитировать Сообщить модератору
 Re: Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
LightN
Member

Откуда: Москва
Сообщений: 189
Maxx,
Вы имете ввиду своя процедура на INSERT, процедура на UPDATE, процедура на DELETE для dbo.Invoice_Detailes, и потом их запускать на клиенте? И чем это лучше чем TRIGGER?
22 июл 16, 14:26    [19441697]     Ответить | Цитировать Сообщить модератору
 Re: Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
LightN,

имеется ввиду что суммы лучше считать не при вставке, а допустим раз в день по не расчитанным или пересчитывать при необходимости или вообще хранить их отдельно и считать соответсвенно
22 июл 16, 14:30    [19441724]     Ответить | Цитировать Сообщить модератору
 Re: Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
LightN,

да именно ето я имею в виду. Да чем угодно
1. Контроль исполнения
2. Обработка ошибок
3. Доп вычисления,условия..етц
4. Передача параметров
5. Можно построить нормальную модель безопасности

Могу еще пунктов 100 написать.. не говоря уже о том что могут понадобиться интеад офф тригерра для\ прекондиций
22 июл 16, 14:32    [19441733]     Ответить | Цитировать Сообщить модератору
 Re: Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
invm
Member

Откуда: Москва
Сообщений: 9404
LightN,

Исходите из того, что в вашем случае триггер/обновляемое представление - надежное решение, а процедуры и т.п. - нет.
Раздельные триггеры на insert/update/delete будут несколько производительнее универсального.
22 июл 16, 14:51    [19441831]     Ответить | Цитировать Сообщить модератору
 Re: Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
invm
Member

Откуда: Москва
Сообщений: 9404
Тьфу. Индексированное представление, конечно же.
22 июл 16, 14:53    [19441846]     Ответить | Цитировать Сообщить модератору
 Re: Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
LightN
Member

Откуда: Москва
Сообщений: 189
invm
LightN,
Исходите из того, что в вашем случае триггер/обновляемое представление - надежное решение, а процедуры и т.п. - нет.
Раздельные триггеры на insert/update/delete будут несколько производительнее универсального.

Тут я с Вами целиком и полностью. Двое влезли в счёт с разными правами и всё поплыло, тут посчитальсь, тут нет. И бошку сломаешь на корректной структуре процедуры.
22 июл 16, 15:02    [19441900]     Ответить | Цитировать Сообщить модератору
 Re: Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
LightN
Member

Откуда: Москва
Сообщений: 189
invm,
А функция вообще не вариант?
22 июл 16, 15:03    [19441912]     Ответить | Цитировать Сообщить модератору
 Re: Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
LightN,

для маленькой системы подойдет и триггер и view,
для большой только процедуры, триггеры сложно контролировать и рефакторить, view прожорливые.
Плюс процедурами можно какой никакой но порядок в системе навести и права правильно раздать,
trigger и view это стратегический хаос в большой системе.

ну и на последний гвоздь в крышку гроба, триггер всегда отключить можно.
22 июл 16, 16:45    [19442889]     Ответить | Цитировать Сообщить модератору
 Re: Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
invm
Member

Откуда: Москва
Сообщений: 9404
WarAnt
Плюс процедурами можно какой никакой но порядок в системе навести и права правильно раздать,
trigger и view это стратегический хаос в большой системе.
Порядок в системе можно навести заранее, при проектировании, пользуясь при реализации того или иного механизма наиболее подходящими для этого средствами, а не вводя на какие-то из этих средств табу, руководствуясь религиозными соображениями.
WarAnt
ну и на последний гвоздь в крышку гроба, триггер всегда отключить можно.
Сильный аргумент, что тут скажешь.
Теперь все виды констрейнтов объявляем "злом", ибо их тоже можно отключить.
25 июл 16, 11:25    [19450091]     Ответить | Цитировать Сообщить модератору
 Re: Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
invm
WarAnt
ну и на последний гвоздь в крышку гроба, триггер всегда отключить можно.
Сильный аргумент, что тут скажешь.
Теперь все виды констрейнтов объявляем "злом", ибо их тоже можно отключить.
+100500
В начало процедуры всегда RETURN вставить можно.
Для манипуляций с данными в таблице совершенно необязательно вызывать написанную для этого процедуру.
Да и процедур таких может быть великое множество, особенно если царит анархия в среде разработчиков.
Я знаю о чём говорю - у нас когда-то такое было.

Сейчас мне скажут: это какие же права доступа должны быть, чтобы редактировать текст процедуры!
А я так скажу: не каждый может отключить/включить триггер!
25 июл 16, 11:34    [19450177]     Ответить | Цитировать Сообщить модератору
 Re: Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
автор
ну и на последний гвоздь в крышку гроба, триггер всегда отключить можно.

триггерофобы во всей красе...
25 июл 16, 11:42    [19450237]     Ответить | Цитировать Сообщить модератору
 Re: Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
LightN
Member

Откуда: Москва
Сообщений: 189
Спасибо за ответы. В нашей системе живут оба способа и процедуры и триггера ...
Однако вернемся конкретно к теме.
Есть в 100-не разных мест итоговые суммы, как имнно их лучше проставлять и контролировать.
Я вообще не понимаю почему создатель MSSQL не положил их (Sum) в констрейнты, как удобную и полезную опцию? Ну всё равно система бегает по ключам slave - parent, ну и Итого заодно считала и проверяла бы тоже.
И ещё - а функция вообще не вариант?
25 июл 16, 13:01    [19450753]     Ответить | Цитировать Сообщить модератору
 Re: Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
LightN,

создатели SQL сделали намного лучше расчета сумм - они реализовали OLAP сервис.
25 июл 16, 17:51    [19453060]     Ответить | Цитировать Сообщить модератору
 Re: Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
Maxx
правильно писать бизнесс логику на хранимых процедурах +держать поле в таблице (можно и вычисляемое)
а вешать все на тригерра или вью - ИМХО неправильно. Нахрена сервер напрягать лишними вычислениями.


+ 1024.

Смотрите на бизнес логику - например, 1С вообще не хранит такие данные и живут же люди.
Тоже вариант.
25 июл 16, 18:02    [19453149]     Ответить | Цитировать Сообщить модератору
 Re: Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3741
WarAnt
LightN,

для маленькой системы подойдет и триггер и view,
для большой только процедуры, триггеры сложно контролировать и рефакторить, view прожорливые.
Плюс процедурами можно какой никакой но порядок в системе навести и права правильно раздать,
trigger и view это стратегический хаос в большой системе.

ну и на последний гвоздь в крышку гроба, триггер всегда отключить можно.


этот же гвоздь можно забить в диск с файлами базы


если нужны актуальные данные надо считать в триггере, если моэно и через неделю, то наверное можно какой-то ручной операцией "а ну-ка пересичтай-ка"
25 июл 16, 18:22    [19453299]     Ответить | Цитировать Сообщить модератору
 Re: Итоговые суммы. Что и когда лучше: VIEW, function или TRIGGER  [new]
BoykoSlava
Member

Откуда: Санкт-Петербург
Сообщений: 44
Я может и не догоняю сложности вопроса... но. Логика у меня в таких вопросах простая,
а) если данные (Сумма счета) нужны тут же (онлайн), после вставки/редактирования/удаления Details - однозначно триггер. И один на все три действия, ибо логика вычисления во всех случаях одна.
б) если не нужен онлайн (хотя я как то слабо представляю себе, как вставил строчку с товаром в счет, а потом еще кнопку нажимай "Пересчитай сумму").. - то хранимкой.
в) если данные читаются чаще, чем считаются (а насколько я понял это как раз ваш случай) - однозначно хранить их в БД. А если учесть, что наверняка и отчет потом нужен будет по суммам всех сумм, то вычислять из вычисялемых... не нравится мне такое :)
25 июл 16, 20:34    [19453775]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить