СУХАЯ структура С ++ - PullRequest
       17

СУХАЯ структура С ++

2 голосов
/ 19 февраля 2010

У меня есть простая структура c ++, которая широко используется в программе. Теперь я хочу сохранить структуру в базе данных sqlite как отдельные поля (а не как двоичные объекты).

Какие есть хорошие способы сопоставить атрибуты структуры со столбцами базы данных?

Ответы [ 6 ]

1 голос
/ 19 февраля 2010

Некоторые интерпретируемые языки / языки сценариев (PHP и т. Д.) Поддерживают «совершенствование», при котором код может проверить себя. Это позволило бы структуре базы данных автоматически сериализовать членов структуры в базу данных или из нее. К сожалению, C / C ++ изначально не поддерживает это. Поэтому, если вы не хотите сохранить его как гигантский большой двоичный объект (который, безусловно, имеет недостатки), вам необходимо вручную сопоставить каждый элемент структуры со столбцом БД.

Единственная сложная часть (помимо трудоемких) заключается в выборе типа столбца db, который лучше всего соответствует типу данных C. (char [] -> varchar и т. д.). Как предположил jkp, неплохо иметь тонкий класс-обертку для чтения / записи каждой из ваших постоянных структур.

1 голос
/ 19 февраля 2010

Поскольку C ++ не очень «динамический» язык, ему не хватает ORM , которые вы обычно можете найти доступными на других языках, которые облегчают эту задачу.

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

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

0 голосов
/ 14 июля 2014

В отличие от некоторых других ответов, я говорю, что эта задача может быть автоматизирована. Например. взгляните на айву (http://quince -lib.com ). Это позволяет вам делать такие вещи:

struct point {
    float x;
    float y;
};
QUINCE_MAP_CLASS(point, (x)(y))

extern database db;
table<point> points(db, "points");

(Полное раскрытие: я написал айву.)

0 голосов
/ 20 февраля 2010

Я создал систему полей и записей, теперь основанную на шаблоне составного дизайна. Поля содержат метод для возврата имени поля и, необязательно, типа поля (для оператора SQL). В настоящее время я перемещаю содержимое SQL из поля в объект Visitor.

Запись содержит функцию для возврата имени таблицы.

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

Я пробовал другие методы, но мой код эволюционировал до этой реализации.

0 голосов
/ 19 февраля 2010

Мне нравится использовать отношения один-к-одному между моими полями структуры данных и полями базы данных. Где каждая запись в таблице представляет собой полный экземпляр структуры. Единственное исключение, если это приведет к чрезмерной ненормализации в таблице. Теперь, чтобы получить данные в / из базы данных из структуры, я реализую класс шаблона, который принимает структуру в качестве параметра шаблона. Затем я наследую шаблон и внедряю функции get / set структуры в базу данных. Я использую библиотеку OTL для всех реальных операций ввода-вывода базы данных. Это делает бремя специального класса для каждого типа конструкции менее навязчивым.

0 голосов
/ 19 февраля 2010

Трудно ответить вообще. Самый простой подход - один столбец на атрибут, который может подходить или не подходить для вашего приложения.

Другой крайний случай - объединить все это в один столбец, в зависимости от того, как вы собираетесь использовать сохраненные данные.

Может быть, использовать какую-то другую среду хранения? sqlite может быть не лучшим решением здесь.

...