Является ли многозначный параметр хранимой процедуры просто плохой практикой?

У меня странное отвращение к передаче нескольких параметров ID в одну хранимую процедуру. Например, это кажется неправильным:

GetMyObject(ListofIDs, OtherParam1, OtherParam2, ...)

Я понимаю, КАК это сделать (правильно, если должен).. но я не чувствую, что должен это делать. Я чувствую, что это побеждает цель хранимой процедуры/подпрограммы «получить элемент». Я чувствую, что должен построить свои SP для поддержки соответствующих параметров фильтра. Если у моего вызывающего абонента есть список идентификаторов, разве они не должны вызывать sp столько раз?

Помощь?


person deLux_247    schedule 20.07.2010    source источник
comment
Если вызывающему абоненту регулярно требуется множество объектов и у него множество идентификаторов, я бы не стал заставлять его вызывать одну и ту же процедуру несколько раз. Не согласен с тем, что GetItem(...) возвращает несколько элементов, но нет проблем с тем, что GetItem(...) делает это. Вызовы базы данных стоят дорого.   -  person seanb    schedule 20.07.2010


Ответы (1)


Процедура «получить элемент по идентификатору» никогда не должна возвращать более одного объекта, потому что это не имеет абсолютно никакого лингвистического смысла.

Процедура «получения предметов по идентификаторам»? Конечно, если у вас есть достойный вариант его использования, и он будет использоваться достаточно часто.

Но в большинстве случаев, да, вместо подпрограммы, возвращающей несколько элементов по идентификатору, вам нужна подпрограмма, которая возвращает элементы на основе параметров фильтрации, соответствующих приложению (например, «дайте мне все транзакции с 8 января на сумму более 10 долларов США»).

Кстати, иногда диапазон идентификаторов (например, от 5 до 10) является вполне допустимым набором фильтров!

Между прочим, это не обязательно проблема MySQL или SQL в целом. Почти любой API запроса набора данных на любом языке будет задавать одни и те же вопросы дизайна, и их ответы обычно будут очень похожими.

person Nicholas Knight    schedule 20.07.2010
comment
Я думаю, это интересный способ думать об этом. Почему диапазон идентификаторов не может быть набором фильтров? Проблема, с которой я сталкиваюсь снова и снова, заключается в том, что приложению нужны все элементы (для списка идентификаторов) в одном вызове ради производительности. Таким образом, вместо того, чтобы делать 16 звонков, они захотят сделать один звонок с 16 идентификаторами. - person deLux_247; 20.07.2010
comment
@deLux_247: Если приложению нужен такой вызов, дайте ему его. Это вполне разумный выбор для некоторых случаев использования. Но я бы внимательно посмотрел, зачем это нужно приложению - откуда оно получает идентификаторы? Если они исходят из базы данных, то почему тогда она просто не запросила необходимые данные? Действительно ли будет так много идентификаторов? Например, если вариант использования только два или три одновременно, я не понимаю, почему он не может вызывать его один раз для каждого идентификатора, если только ваша инфраструктура не сильно перегружена. - person Nicholas Knight; 20.07.2010