Я пишу сценарий Perl для анализа схемы базы данных mysql и создания классов C++ при необходимости. Мой вопрос довольно простой, но это то, чего я раньше не делал и не знаю общепринятой практики. Любой объект любого из созданных классов должен иметь методы "get" для заполнения этой информации. Итак, у меня двоякий вопрос:
Я могу пойти обоими путями на №1 и склоняюсь к положительному ответу на №2. Любые советы, указатели будут очень признательны.





есть существующие инструменты, которые меняют db на java (и, возможно, на другие языки). рассмотрите возможность использования одного из них и преобразования его в C++.
Я бы не рекомендовал использовать ваши методы get в базе данных, за исключением случаев, когда это абсолютно необходимо для вашей конкретной проблемы. Это приводит к гораздо большему количеству мест, где что-то может пойти не так, и, вероятно, к множеству ненужных чтений в вашей БД, и может непреднамеренно привязать ваши объекты к специфическим для базы данных функциям, теряя многие преимущества многоуровневой архитектуры. Что касается вашей модели предметной области, то базы данных не существует.
редактировать - это для №2 (очевидно). Для №1 я бы сказал «нет» по многим из тех же причин.
Сначала поймите, что вы заново изобретаете колесо. Практически на каждом языке существует ряд достойных библиотек объектно-реляционного сопоставления для доступа к базе данных. Для C / C++ вы можете посмотреть:
http://trac.butterfat.net/public/StactiveRecord
http://debea.net/trac
Хорошо, если это не так, вы, вероятно, захотите создать в своем классе статический метод с именем find или search, который является фабрикой для создания объектов и выбора их из базы данных:
Artist MJ = Artist::Find("Michael Jackson");
MJ->set("relevant", "no");
MJ->save();
Обратите внимание на метод сохранения, который затем берет измененный объект и сохраняет его обратно в базу данных. Если вы действительно хотите создать новую запись, вы должны использовать метод new, который будет создавать пустой объект:
Artist StackOverflow = Artist->new();
StackOverflow->set("relevant", "yes");
StackOverflow->save();
Обратите внимание на то, что методы set и get здесь просто устанавливаются и получают значения из объекта, а не из базы данных. Чтобы фактически сохранить элементы в базе данных, вам нужно будет использовать статический метод Find или метод объекта save.
Обычно самая дорогостоящая часть приложения - это обращение к базе данных и обратно, поэтому было бы гораздо эффективнее заполнять все элементы данных из одного запроса, чем делать их по одному, либо по мере необходимости, либо из ваш конструктор. После того, как вы заплатили за поездку туда и обратно, вы также можете окупить свои деньги.
Кроме того, как правило, ваши методы get * должны быть объявлены как const, что означает, что они не изменяют базовый объект, поэтому их выход в базу данных для заполнения объекта нарушит это (что вы могли бы разрешить, сделав переменные-члены изменяемый, но это в основном нарушит цель const).
Чтобы разбить все на конкретные шаги, я бы порекомендовал:
Я согласен на 100% насчет поездок по db. Предостережение заключается в том, что будет несколько исполняемых файлов, использующих эти классы, и большое количество данных будет заполняться без надобности. Вот тут я и начинаю чесать в затылке. Большая часть будет доступна только для чтения.
Я должен пояснить, что, говоря, что разные исполняемые файлы будут использовать класс для разных подмножеств полей (столбцов в базе данных). Спасибо за ответ.
Я бы все же сказал, что если мы не говорим об очень сложных или больших типах данных (например, 2 МБ CLOB), стоимость множественных обращений к базе данных затмит затраты на заполнение данных, которые вам не понадобятся довольно быстро.
Другой альтернативой было бы не автоматизировать создание классов, а вместо этого создавать отдельные классы, содержащие только элементы данных, которые интересуют отдельные исполняемые файлы, чтобы эти классы извлекали только необходимые данные.
Однако не знаю, о скольких таблицах мы говорим, так что это может резко увеличить объем вашего проекта.
Да, я видел, как несколько (sql2class) были одними из них. Я не особо рассматривал Active Record или ORM, но, полагаю, это возможно.