ASP.NET Nested OOP Лучший подход к производительности запросов - PullRequest
0 голосов
/ 15 марта 2012

// опция 1

public class division
{
    public int DivisionId { get; set; }
    public string DivisionName { get; set; }
    public employee Employee { get; set; }

    public class employee
    {
        public int EmpId { get; set; }
        public string EmpName { get; set; }

        public employee(int id)
        {
            sql = new SqlCommand("select empid,empname from employee where divisionid = '" + id + "'", conn);
            conn.Open();
            dt = sql.ExecuteReader(CommandBehavior.SingleRow);
            if (dt.Read())
            {
                EmpId = id;
                EmpName = (string)dt["empname"];
            }
            dt.Close();
            conn.Close();
        }
    }
    public division(int id)
    {
        sql = new SqlCommand("select divisionid,divisionname from division where divisionid = '" + id + "'", conn);
        conn.Open();
        dt = sql.ExecuteReader(CommandBehavior.SingleRow);
        if (dt.Read())
        {
            DivisionId = id;
            DivisionName = (string)dt["divisionname"];
            Employee = new employee((int)dt["divisionid"]);
        }
        dt.Close();
        conn.Close();
    }
}

// опция 2

public class division
{
    public int DivisionId { get; set; }
    public string DivisionName { get; set; }
    public employee Employee { get; set; }

    public class employee
    {
        public int EmpId { get; set; }
        public string EmpName { get; set; }

        public employee()
        {
        }
    }
    public division(int id)
    {
        sql = new SqlCommand("select divisionid,divisionname from division a join employee b on a.divisionid = b.divisionid where a.divisionid = '" + id + "'", conn);
        conn.Open();
        dt = sql.ExecuteReader(CommandBehavior.SingleRow);
        if (dt.Read())
        {
            DivisionId = id;
            DivisionName = (string)dt["divisionname"];
            Employee = new employee();
            Employee.EmpId = (int)dt["empid"];
            Employee.EmpName = (string)dt["empname"];
        }
        dt.Close();
        conn.Close();
    }
}

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

Первый метод, который сделал удобным вызов каждого Атрибута в классе, но он требует вложенного соединения для вызова класса и его атрибута.Пример (option1), 2 туда и обратно в базу данных, первый - когда мы вызываем Division, а второе соединение - когда мы вызываем Employee.Но SQL, необходимый для каждой поездки соединения с базой данных, очень удобен для кодирования (простой и короткий).

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

Эти примеры представляют собой простую форму Вложенного ООП, но то, что произошло, когда связанная таблица сложна (например, 5-6 табличное отношение), что означаетнам нужен длинный и сложный запрос с использованием объединения для каждой таблицы.

1 Ответ

0 голосов
/ 15 марта 2012

Обходные пути к базе данных дороги, поэтому второй вариант работает лучше. Если вам нужно, чтобы объединение работало лучше, добавьте индекс в столбец divisionid таблицы employee.

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

sql = new SqlCommand("select divisionid,divisionname from ..

должно быть

sql = new SqlCommand("select a.divisionid, divisionname, empid, empname  from ..

Вы уверены, что в отделе работает только один сотрудник?

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