2010-10-29 4 views
2

Мои классы доступа к данным часто имеют метод loadDataToEntity или что-то подобное. Этот метод принимает, например, набор результатов и заполняет класс сущности, который передается клиенту.Извлечение данных базы данных - общий метод извлечения?

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

Так что это хороший способ уменьшить код, но я часто слышу, что вы должны получить как можно меньше столбцов. Чтобы использовать мой общий метод, все хранимые процедуры должны извлекать все столбцы, необходимые для loadDataToEntity(). Кроме того, когда столбец добавляется в таблицу и извлекается хранимой процедурой, все остальные хранимые процедуры должны быть изменены, а также извлекать этот столбец.

Мне интересно, есть ли лучший способ как для общего метода, так и для получения различного количества столбцов, иногда в зависимости от хранимой процедуры?


public Entity getById(int id) 
{  
    ResultSet rs; 
    //call stored procedure A and stuff 
    return loadDataToEntity(rs); 
} 
public Entity getByName(String name) 
{ 
    ResultSet rs; 
    //call stored procedure B and stuff 
    return loadDataToEntity(rs); 
} 
public Entity loadDataToEntity(ResultSet rs) 
{ 
    // fill and return entity here 
} 

ответ

1

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

И наоборот, если вы упорядочили схему базы данных в нормализованной форме, у вас может быть таблица родительских сущностей (которая может просто содержать идентификатор объекта) и несколько подтабликов, по одному на тип сущности. В этом случае вы можете запустить несколько запрошенных запросов для получения различных типов сущностей; например

select E.EntityId, S.EntityName, S.EntityAge 
from Entity E 
inner join SubEntity S on E.EntityId = S.EntityId 

или

select E.EntityId, A.EntityAddress, A.EntityGender 
from Entity E 
inner join AnotherSubEntity A on E.EntityId = S.EntityId 

Компромисс с этим вторым подходом является необходимость выполнения нескольких запросов, которые на самом деле могут быть медленнее. Тем не менее, я решил это в своем приложении, выполнив запросы параллельно и мультиплексируя результаты вместе в приложении.

+0

Да, второй подход, вероятно, подойдет мне лучше, так как я почти всегда работаю с нормализованной базой данных. Пример: Пользователь таблицы queryA: получает информацию о пользователе, необходимую для проверки правильности входа в систему. Требуется столбец a, b и c. queryB: получает информацию о пользователе, необходимую для размещения заказа. Требуются столбцы a, c и d. В этом случае, если в таблице всего 4 столбца, лучше всего иметь общий метод, который загружает эти 4 столбца в объект сущности и имеет оба запроса A и B, чтобы получить все 4 столбца. – KTrum

+0

@ Karl - Трудно вам посоветовать, не зная точную информацию о вашем приложении, но я бы всегда советовал запрашивать явно только нужные вам столбцы, а не запускать «select *». Это сделает вас более устойчивыми к изменениям схемы, так как вы «быстро сработаете». Это также позволяет вам более легко справляться с тем, что происходит с использованием инструмента профилирования SQL, поскольку вы можете легче создать шаблон поведения. – Adamski

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