Нужен совет по реализации

Здравствуйте.

Я пытаюсь написать базу данных. Для представления одного поля, хочу написать структуру Data, которая будет хранить название данных, тип данных и значение.

Но есть одна проблема. Как организовать значение этих данных?

У меня были варианты сделать значение строковым типом, то есть как то так:

struct Data
{
    std::string name;
    enum { STRING, INTEGER, DOUBLE, BOOLEAN };
    int type;
    std::string value;
};

Но тогда пропадает весь смысл члена type теряется.

Ещё была идея сделать так:

struct Data
{
    std::string name;
    enum { STRING, INTEGER, DOUBLE, BOOLEAN };
    int type;

    int *intval;
    double *doubleval;
    std::string *stringval;
    bool *boolval;

};

То есть выделять память под указатель того типа, который используется.

Что лучше по-вашему? Или у вас есть свой вариант?

porshe, вопрос: какая модель данных предполагается в твоей БД?

Пока что твои зарисовки выглядят... ну не совсем...

На счёт первого варианта — ты уже и сам догадался.

На счёт второго... Ты хочешь иметь в записи n-ное количество указателей (n == количеству типов данных), но при этом реально использовать только один из них. Понимаешь, куда я клоню?

Кстати, конечно enum есть int, но... (1) в C++11 это может быть и необязательно int и (2) если писать в духе C++, а не чистого C, то следовало бы написать

    enum FieldType { STRING, INTEGER, DOUBLE, BOOLEAN };
    FieldType type;

дабы не вводить себя в искушение.

И вот ещё член структуры name. Это что, у каждого значения будет своё уникальное имя? Или НЕ уникальное? Или его для каждого значения быть вообще не должно? (зависит, в частности, от модели данных БД)

Если хочешь сам контролировать типы данных, то храни просто байты.

какая модель данных предполагается в твоей БД?

Не знаю, да и БД то её сложно назвать... Так баловство. Хочу сделать что то типа БД, где пользователь бы мог сам настраивать поля данных для объектов. То есть объект будет выглядеть как то так:

class Object
{
    private:
        std::list<Data> data; //При условии, что Data работает корректно
};

Естественно, у каждой БД будет свой тип, определяемый классом Object.
Член name служит для названия поля. Объясняю я косоязычно, покажу пример:
Допустим, БД используется для хранения данных о жителях города N. На каждого человека в БД задаётся имя, фамилия, возраст.
Содержимое:

Василий Шуйский 13
Иванов Петр 15
Зуев Иван 56

Тогда член data класса Object будет хранить 3 объекта класса Data. name первого объекта Data будет «Фамилия», второго — «Имя», третьего — «возраст».
Тип первого будет STRING, второго — STRING, третьего — INTEGER.
Сама БД будет представляться как std::list<Object>.

Если хочешь сам контролировать типы данных, то храни просто байты.

Вот это мне кажется наиболее удачным вариантом, пожалуй, так и поступлю.

Мне кажется, что ты ещё сам для себя не определился что это и для чего это нужно.

Допустим, БД используется для хранения данных о жителях города N.

Город N, надеюсь, уездный? ;-)

Сейчас я вижу, что в каждом объекте дублируются названия имён полей. Это есть нехорошо.

По этой БД будет достаточно проблематично (медленно) сделать выборку, допустим, по фамилии. Да и вообще делать какие-либо действия достаточно сложно: структура данных нефиксирована, каждый Object может иметь свой набор полей со своими типами данных. Причём даже нет гарантии, что поля с одинаковыми именами имеют одинаковый тип данных. Как с этим работать — лично я, не представляю.

Ты таки почитай в Википедии по поводу различных моделей данных и смежные статьи по ссылкам.

Город N, надеюсь, уездный? ;-)

Ну да, город N уездный, если верить И. Ильфу и Е. Петрову («Двенадцать стульев»). Но, впрочем, песня(и) хорошая(ие) :)

Ты таки почитай в Википедии по поводу различных моделей данных и смежные статьи по ссылкам.

Хорошо, сначала попытаюсь заполнить пробелы в теории, а только потом к практике приступлю :)

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

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

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.