Итак, я довольно новый программист, работающий по направлению на степень бакалавра Comp Sci с очень небольшим количеством опыта работы. При поиске заданий на стажировку для моей программы я заметил, что то, что я слышал от нескольких профессоров - "работа с базами данных составляет 90% от всех современных заданий в области компьютерных наук" - похоже, что это действительно так. Тем не менее, моя программа на самом деле не имеет курсов с базами данных до 3-го года, поэтому я стараюсь, по крайней мере, научиться чему-то самому себе в среднем.
Я видел очень мало на SO и в интернете вообще для кого-то вроде меня. Кажется, что есть тонны учебников по механике, как читать и писать данные в базе данных, но мало о соответствующих передовых методах. Чтобы продемонстрировать, о чем я говорю, и чтобы помочь решить мой фактический вопрос, вот что можно легко найти в Интернете:
public static void Main ()
{
using (var conn = new OdbcConnection())
{
var command = new OdbcCommand();
command.Connection = conn;
command.CommandText = "SELECT * FROM Customer WHERE id = 1";
var dbAdapter = new OdbcDataAdapter();
dbAdapter.SelectCommand = command;
var results = new DataTable();
dbAdapter.Fill(results);
}
// then you would do something like
string customerName = (string) results.Rows[0]["name"];
}
И так далее. Это довольно просто понять, но, очевидно, полный проблем. Я начал с кода вроде этого и быстро начал говорить такие вещи, как "Ну, кажется, глупо иметь SQL везде, я должен положить все это в файл констант". И тогда я понял, что глупо иметь те же самые строки кода повсюду и просто помещать все это с объектами подключения и т.д. Внутри метода:
public DataTable GetTableFromDB (string sql)
{
// code similar to first sample
}
string getCustomerSql = String.Format(Constants.SelectAllFromCustomer, customerId);
DataTable customer = GetTableFromDB(getCustomerSql);
string customerName = (string) customer.Rows[0]["name"];
Это казалось большим улучшением. Теперь это супер-легко, скажем, перейти от OdbcConnection к SQLiteConnection. Но эта последняя строка, доступ к данным, все еще казалась неудобной; и по-прежнему больно менять имя поля (например, переходить от "name" в "CustName" или что-то еще). Я начал читать о с использованием типизированных наборов данных или настраиваемых бизнес-объектов. Я все еще смущен всей терминологией, но решил посмотреть в нее в любом случае. Я полагаю, что глупо полагаться на блестящий Мастер базы данных, чтобы сделать все это для меня (как в связанных статьях), прежде чем я действительно узнаю, что происходит, и почему. Поэтому я сам взял в него удар и начал получать такие вещи, как:
public class Customer
{
public string Name {get; set;}
public int Id {get; set;}
public void Populate ()
{
string getCustomerSql = String.Format(Constants.SelectAllFromCustomer, this.Id);
DataTable customer = GetTableFromDB(getCustomerSql);
this.Name = (string) customer.Rows[0]["name"];
}
public static IEnumerable<Customer> GetAll()
{
foreach ( ... ) {
// blah blah
yield return customer;
}
}
}
чтобы скрыть уродливое содержимое таблицы и обеспечить сильную типизацию, позволяя внешнему коду просто делать что-то вроде
var customer = new Customer(custId);
customer.Populate();
string customerName = customer.Name;
что действительно приятно. И если таблица Customer изменяется, изменения в коде должны произойти только в одном месте: внутри класса Customer
.
Итак, в конце всего этого бессвязного, мой вопрос таков. Произошла ли моя медленная эволюция кода базы данных в правильном направлении? И куда я иду дальше? Этот стиль хорошо подходит для небольших баз данных, но когда есть множество разных таблиц, выписывать все эти классы для каждого из них будет больно. Я слышал о программном обеспечении, которое может генерировать этот тип кода для вас, но я все еще смущен DAR/ORM/LINQ2SQL/etc жаргоном, и эти огромные программные продукты являются подавляющими. Я ищу какие-то хорошие, не подавляюще сложные ресурсы, которые могут указывать мне в правильном направлении. Все, что я могу найти на эту тему, - это сложные статьи, которые проходят по моей голове, или статьи, которые просто показывают вам, как использовать мастеров point-and-click в Visual Studio и т.д. Также обратите внимание, что я ищу информацию о работе с базами данных в коде, а не информацию о дизайне/нормализации базы данных... там есть много хорошего материала.
Спасибо, что прочитали эту гигантскую стену текста.