2012-04-21 2 views
1

Я пишу систему управления контентом, которая может хранить метаданные о разных типах документов. Каждый тип документа имеет свой собственный набор полей метаданных. Например, в письме есть поля, такие как «Кому», «От», «Адресат», «Отменить адрес» и т. Д., В то время как у MinutesOfMeeting есть поля «DateHeldOn», «TimeHeldOn», «AttendedBy» и т. Д.Одиночный вызов базы данных со многими параметрами и многими вызовами базы данных с несколькими параметрами

Я сохраняю это информация в базе данных в двух таблицах: общая и конкретная. Общая информация о хранилище, которая является общей для всех типов, таких как DocumentOwnerName, DocumentCreatedDate, DocumentSize и т. Д. Специфическая таблица - это не одна таблица, а набор из 35 разных таблиц, по одному для каждого типа документа.

У меня есть страница, содержащая сетку, в которой я показываю список документов. Одна запись соответствует одному документу. Поскольку сетка создана для отображения документов всех типов, поэтому первая строка может отображать букву, вторая - MinutesOfMeeting, третья - памятка и т. Д.

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

Проблема в том, что касается 35 различных типов документов, каждая из которых имеет 10 полей, в итоге я получаю более тысячи параметров для этой процедуры. Это кошмар для обслуживания. Я ищу решение.

Одним из решений является разобраться с каждой конкретной таблицей индивидуально, возвращая идентификаторы, а затем объединить их. Это прекрасно, за исключением того, что я должен сделать 36 различных вызовов в базе данных, по одному для конкретной таблицы плюс один для общей таблицы.

Все это сводится к простому выбору архитектуры. Должен ли я сделать один вызов базы данных, передающий множество параметров, или мне нужно, чтобы многие вызовы базы данных передавали несколько параметров.

Какой подход более предпочтителен и почему?

Редактировать: веб-сервер и сервер базы данных находятся на одной машине. Поэтому скорость сети не должна иметь значения.

+0

может у пожалуйста, укорачивают свой вопрос ...... – abhi

+1

Или, по крайней мере, облегчить людям понимание того, что является основным вопросом. :-) –

+0

Также обратите внимание, что до тех пор, пока вы находитесь в пределах одной транзакции, несколько запросов (особенно если через подготовленные операторы или хранимые процедуры) не будут значительно медленнее, чем один мега-запрос. –

ответ

1

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

TYPE param_type IS RECORD (
    To 
    From 
    ToAddress 
    FromAddress 
    DateHeldOn 
    TimeHeldOn 
    AttendedBy 
); 

PROCEDURE do_search (in_params IN param_type); 

Структура записи является конечно, вам. Если процедура закодирован игнорировать записи элементы, которые являются NULL, то все абонент должен сделать, это установить те элементы, которые необходимы, например:

DECLARE 
    p param_type; 
BEGIN 
    p.DateHeldOn := DATE '2012-01-01'; 
    do_search(p); 
END; 
+0

Этот подход более удобен в обслуживании, несмотря на то, что мне приходится управлять 35 различными удтами. Количество «вещества», отправленного с фронта, остается таким же, хотя и более организованным. Я пробовал объекты в oracle, делая один для каждой таблицы, но поскольку мы не можем иметь частичные объекты, поэтому читаемость ОЧЕНЬ уменьшается. Тем не менее, интересный подход, спасибо. – Atif

Смежные вопросы