Каков наилучший способ сохранить отношение в основной памяти? - PullRequest
0 голосов
/ 01 апреля 2011

Я работаю над приложением, которое представляет собой мини-дизайн СУБД для оценки запросов SPJ.Программа реализуется на C ++.

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

Мой вопрос: как лучше всего добиться этого в C ++?Какую структуру данных мне нужно использовать для достижения этой цели?

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

У меня в приложении только 2 типа данных: int (4 байта) и char (1 байт)

Я могу использовать std :: vector.Фактически, я попытался использовать вектор векторов: внутренний вектор используется для хранения атрибутов, но проблема в том, что в базе данных может быть много отношений, и каждый из них может иметь любое количество атрибутов.Кроме того, каждый из этих атрибутов может быть int или char.Итак, я не могу определить, как лучше всего достичь этого.

Редактировать

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

Ответы [ 2 ]

2 голосов
/ 01 апреля 2011

Отношение - это набор кортежей (а в SQL таблица - это мешок с рядами).Как в реляционной теории, так и в SQL все кортежи (/ строки) в отношении (/ table) «соответствуют заголовку».

Поэтому интересно сделать объект для хранения отношений (/ tables), состоящих издвух компонентов: объект типа «Заголовок» и объект Set (/ Bag), содержащий фактические кортежи (/rows).

Объект «Заголовок» сам является сопоставлением имен атрибутов (/ column)в «объявленные типы данных».Я не знаю C, но в Java это может быть что-то вроде Mapили картаили даже карта(при условии, что вы можете использовать эти строки, чтобы получить фактические объекты «Тип», где бы они ни находились).

Набор кортежей (/ строк) состоит из членов, которые являются отображением атрибута (/ столбца)имена для атрибута Значения, которые являются int или String, в вашем случае.Самая большая проблема здесь в том, что это говорит о том, что вам нужно что-то вроде карты, но у вас могут возникнуть проблемы из-за того, что ваш int не является объектом.

0 голосов
/ 01 апреля 2011

В качестве универсального контейнера для любых строк таблицы я бы, скорее всего, использовал std::vector (как указал Iarsmans). Что касается столбцов таблицы, я бы, скорее всего, определил столбцы со структурами, представляющими схему таблицы. Например:

struct DataRow
{
    int col1;
    char col2;
};

typedef std::vector<DataRow> DataTable;
DataTable t;
DataRow dr;
dr.col1 = 1;
dr.col2 = 'a';

t.push_back(dr);
...