Форум программистов, компьютерный форум CyberForum.ru

Попытка написать простенькую БД - C++

Восстановить пароль Регистрация
 
Sonance
6 / 6 / 3
Регистрация: 15.02.2013
Сообщений: 55
20.05.2014, 10:46     Попытка написать простенькую БД #1
Хочу попробовать написать простенькую БД, но есть некоторые вопросы по реализации.
Немогу придумать как реализовать:
У каждой ячейки тип необходимый именно для её содержимого.
Была возможность создания нескольких таблиц.
Была возможность в ходе программы добавлять столбцы и строки в таблицу.
Была возможность поиска по фильтру.

Проблема в том чтобы совместить все это в понятный код. М.б. кто делал чтото подобное, подскажите структуру программы, как разделить это все на шаблоны, классы, чтобы удобнее было.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
20.05.2014, 10:58     Попытка написать простенькую БД #2
Я думаю тут вполне одного класса "таблица" хватит. Наделить его методами добавления/вставки/удаления столбцов и строк, добавить свойства связности с другими таблицами. Всякие первичные ключи не забыть.
newbie666
Заблокирован
20.05.2014, 11:07     Попытка написать простенькую БД #3
Цитата Сообщение от Sonance Посмотреть сообщение
Проблема в том чтобы совместить все это в понятный код
твоя проблема ясна как ясный день - тебе нужно, чтоб за тебя кто - то выполнил задание.

Вот в самом деле, неужели ты собрался писать базу данных, если для тебя проблема "написать код"
Ребята из Oracle под столом

Добавлено через 1 минуту
По поводу БД - ставь цели яснее и конкретнее, может алгоритм или технику подкину, а так, по хорошему, та же MS SQL работает вообще в собственной операционной виртуальной системе
Sonance
6 / 6 / 3
Регистрация: 15.02.2013
Сообщений: 55
20.05.2014, 11:45  [ТС]     Попытка написать простенькую БД #4
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Я думаю тут вполне одного класса "таблица" хватит. Наделить его методами добавления/вставки/удаления столбцов и строк, добавить свойства связности с другими таблицами. Всякие первичные ключи не забыть.
При создании объкта такого класса нужно будет в заранее знать кол-во уже имеющихся строк и столбцов, тоесть при добавлении нужно будет пересоздовать объект? А если таблица заполнена 100+ строками, придется копировать все содержимое, пересоздавать объект и записывать туда все заного? Непойму как тогда можно будет с помощью одного и тогоже класса содать таблицу с 3 столбцами, или с 10, если ячейки в строке представлять в виде массива тогда неполучистя сделать ячейки рзных типов.

Цитата Сообщение от newbie666 Посмотреть сообщение
По поводу БД - ставь цели яснее и конкретнее, может алгоритм или технику подкину, а так, по хорошему, та же MS SQL работает вообще в собственной операционной виртуальной системе
Цель - учить С++, БД не тривиальна поэтому решив эту задачу, я лучше буду знать С++
Цитата Сообщение от newbie666 Посмотреть сообщение
твоя проблема ясна как ясный день - тебе нужно, чтоб за тебя кто - то выполнил задание.
Нет мне нужны подсказки чтоб его выполнил я.
Цитата Сообщение от newbie666 Посмотреть сообщение
Вот в самом деле, неужели ты собрался писать базу данных, если для тебя проблема "написать код"
Код написать не проблема, проблема чтобы это было потом читаемо и позволяло вносить изменения не перековыривая все.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
20.05.2014, 11:57     Попытка написать простенькую БД #5
Цитата Сообщение от Sonance Посмотреть сообщение
При создании объкта такого класса нужно будет в заранее знать кол-во уже имеющихся строк и столбцов
Можно по умолчанию и пустой создавать.
Цитата Сообщение от Sonance Посмотреть сообщение
тоесть при добавлении нужно будет пересоздовать объект?
Да. Не весь конечно - только область данных.
Цитата Сообщение от Sonance Посмотреть сообщение
А если таблица заполнена 100+ строками, придется копировать все содержимое, пересоздавать объект и записывать туда все заного?
Именно так.
P.S. 100+ строк - это очень мало.

Цитата Сообщение от Sonance Посмотреть сообщение
сделать ячейки рзных типов
Ну столбцы-то обычно никто в здравом уме на ходу в базу не добавляет. А для разнотипизированных строк воспользуйтесь структурами.
newbie666
Заблокирован
20.05.2014, 12:05     Попытка написать простенькую БД #6
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Именно так.
P.S. 100+ строк - это очень мало
на самом деле если взят книжку по базам Oracle и посмотреть как хоть примерно там всё делается - мозги сплавятся

Вообще там конечно же всё очень сложно, но новичку могу порекомендовать делать допустим в памяти два экземпляра базы, чтоб изменив в одном, во время простоя их свопить, так же нужны управляющие бинарные деревья и хитросвязанные списки для управления, в самом деле, ты ж не собираешься реалоцировать допустим 20 Гб памяти из - за добавления одного элемента в базу?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
20.05.2014, 12:12     Попытка написать простенькую БД #7
newbie666, третье слово в названии темы.
newbie666
Заблокирован
20.05.2014, 12:17     Попытка написать простенькую БД #8
Цитата Сообщение от SatanaXIII Посмотреть сообщение
третье слово в названии темы.
а ну тогда что гемороится - то, простой std::map или std::list и есть простенькая база данных
boost bimap - база данных чуть по сложнее
Sonance
6 / 6 / 3
Регистрация: 15.02.2013
Сообщений: 55
20.05.2014, 12:25  [ТС]     Попытка написать простенькую БД #9
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Можно по умолчанию и пустой создавать.
Если в виде структуры строку представлять, то можно будет создавать нескольлко структур для одного объекта, если я правильно понимаю. Да тогда с добавлением строк нет проблем.
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Ну столбцы-то обычно никто в здравом уме на ходу в базу не добавляет. А для разнотипизированных строк воспользуйтесь структурами.
То есть, если к примеру нужно будет 2 столбца - разных типов, то в структуре будет 2 переменные нужного типа, если нужны будут эти же 2 столбца но других типов - это если неошибаюсь возможно сделать с помощью перегрузки. Но если вдруг понадобиться 3 столбца? в структуру то уже еще 1 переменную недобавить.Или я ошибаюсь?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
20.05.2014, 12:31     Попытка написать простенькую БД #10
Цитата Сообщение от Sonance Посмотреть сообщение
Но если вдруг понадобиться 3 столбца? в структуру то уже еще 1 переменную недобавить.Или я ошибаюсь?
C++
1
2
3
4
5
6
7
struct row // Структура-строка. Массив таких структур и будет одной таблицей.
  {
  unsigned id; // Первый столбец
  string Name; // Второй столбец
  float Some; // Третий столбец
  char SomeAnother[66]; // Четвертый столбец
  };
newbie666
Заблокирован
20.05.2014, 12:48     Попытка написать простенькую БД #11
Цитата Сообщение от Sonance Посмотреть сообщение
Но если вдруг понадобиться 3 столбца? в структуру то уже еще 1 переменную недобавить.Или я ошибаюсь?
не ошибаешься, в жёсткую структуру ничего ясен пень не добавишь, для этого используются гибкие механизмы описателей типов данных, допустим (так...что в голову взбрело)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
std::vector<std::pair<std::string, void*>> dataTable;
 
или
 
std::vector<VARIANT> dataTable;
 
или
 
struct ITEM
{
    std::string types; //например 'FLOAT | INT | DOUBLE'
    void* itemMemory;   
};
 
std::vector<ITEM> dataTable;
тоесть нужен описать типов, которые лежат по адресу, которые есть в каждом элементе базы... Дальше читаешь эту память для каждого элемента согласно описателю.

Добавлено через 3 минуты
Вот допустим, как сделано в DirectX.

C++
1
2
3
4
5
6
7
8
9
10
11
    D3D11_INPUT_ELEMENT_DESC layout[] =
    {
        { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },           
        { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
        { "TANGENT", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 },
        { "BINORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 36, D3D11_INPUT_PER_VERTEX_DATA, 0 },
        { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 48, D3D11_INPUT_PER_VERTEX_DATA, 0 },         
    };
    UINT numElements = ARRAYSIZE( layout ); 
 
    hr = device->CreateInputLayout( layout, numElements, codeBlob->GetBufferPointer(),
Там указываешь что и в каком кол-ве будет лежать в вертекс буффере, а так же указывается байтовое смещение до следующего элемента ...
Sonance
6 / 6 / 3
Регистрация: 15.02.2013
Сообщений: 55
20.05.2014, 12:49  [ТС]     Попытка написать простенькую БД #12
C++
1
2
3
4
5
6
7
struct row // Структура-строка. Массив таких структур и будет одной таблицей.
  {
  unsigned id; // Первый столбец
  string Name; // Второй столбец
  float Some; // Третий столбец
  char SomeAnother[66]; // Четвертый столбец
  };
Я про это и говорю, что это решает проблему добавления строк, но если нужно добавить столбец как быть?
Опять же это если в заранее известно количество столбцов. Но для одной таблицы например нужно 3 столбца типа int, а для другой 5 столбцов типа char, т.е. должна быть возможность пользователю выбирать кол-во столбцов и их тип. Мне кажеться тут без шаблона не обойтись.
newbie666
Заблокирован
20.05.2014, 12:50     Попытка написать простенькую БД #13
Цитата Сообщение от Sonance Посмотреть сообщение
Мне кажеться тут без шаблона не обойтись.
смотри мой пост выше
Sonance
6 / 6 / 3
Регистрация: 15.02.2013
Сообщений: 55
20.05.2014, 13:01  [ТС]     Попытка написать простенькую БД #14
Цитата Сообщение от newbie666 Посмотреть сообщение
смотри мой пост выше
А попроще шаблон нельзя написать конкретно под мою задачу, с vector'ом не работал в нем еще разбираться надо.
newbie666
Заблокирован
20.05.2014, 13:17     Попытка написать простенькую БД #15
Цитата Сообщение от Sonance Посмотреть сообщение
А попроще шаблон нельзя написать
а шаблон тут вообще не причём, он для другого используется. Чтоб иметь возможность динамический добавлять строки и столбцы в свою базу данных тебе нужно что - то вроде этого (хотя про скорость работы можешь забыть, а если забывать не хочешь - учи теорию программирования баз данных):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
std::vector<std::vector<std::pair<std::string,std::string>>> dataTable;
    //тут все данные в виде строки, тип данных для работы с ними указывается в пером элементе пары, данные - во втором
    //допустим добавляют пару строк, в каждой строке два столбца:
    std::vector<std::pair<std::string,std::string>> line;
    line.push_back(std::make_pair("int", "10"));
    line.push_back(std::make_pair("float", "123.987"));
    dataTable.push_back(line);
    line.clear();
    line.push_back(std::make_pair("int", "666"));
    line.push_back(std::make_pair("float", "666.666"));
    dataTable.push_back(line);
    //Всё. Добавил... А теперь хочу добавить ещё один столбец типа 'double' со значение 444.444 во все строки
    for(auto it = dataTable.begin(); it != dataTable.end(); it++)
        it->push_back(std::make_pair("double", "444.444"));
    //Готово! :-)
тут кстате ты вообще как бы к типам не привязан ...
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
20.05.2014, 13:18     Попытка написать простенькую БД #16
Sonance, для простенькой БД можно не брать всех фич которые только есть в существующих системах.

Достаточно определить схему бд как набор классов жесткого размера (т.е. по старинке заводить поле char text[256] константного размера и избегать всего динамического) и написать менеджер который не сразу сбрасывает изменения в файл а при превышении определенного размера занятой оперативной памяти сбрасывает самые мало используемые объекты в файл бд (это самая большая и геморная часть).

Самая простая реализация с использованием базового класса таблицы, который будет иметь конкретный класс схемы, он же будет возвращаемым объектом, а схема бд будет представлена с помощью variadic template, параметрами которой будут конкретные классы таблиц.
C++
1
2
3
4
5
6
7
8
class BDBaseTableSchema { };
 
class BDBaseTable {};
 
template <BDBaseTable... Args>
class BDSchema { };
 
class DB { };
Я таким еще не занимался, код, скорей всего, - неправильный, но суть передает.
newbie666
Заблокирован
20.05.2014, 13:19     Попытка написать простенькую БД #17
Цитата Сообщение от Sonance Посмотреть сообщение
с vector'ом не работал в нем еще разбираться надо.
Да программирование - вообще сложное дело, может ну его? Профессий разных много...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2014, 13:21     Попытка написать простенькую БД
Еще ссылки по теме:

C++ Попытка создать обработку событий
C++ Нужно написать простенькую програмку
Моя первая попытка C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
20.05.2014, 13:21     Попытка написать простенькую БД #18
Цитата Сообщение от newbie666 Посмотреть сообщение
учи теорию программирования баз данных
без этого вообще нельзя
Yandex
Объявления
20.05.2014, 13:21     Попытка написать простенькую БД
Ответ Создать тему
Опции темы

Текущее время: 09:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru