Тема: Базы данных Страниц: 1 | Прочитано 2273 раз |
Artem13 [13-й воин]
Прирожденный Джаец
Ап, и черти у ног моих сели...
Пол: Репутация: +441
|
|
Базы данных « от 21.02.2009 в 11:34:21 » |
|
На работе возникла необходимость создать базу данных, в которой содержались бы сведения о производимых/разрабатываемых приборах, клиентах, отказах и т.п., причем не только простые текстовые записи, но и ссылки на документы, сканы и прочую графику. Сначала хотели тупо использовать Эксель, но работать с документами офиса по сети - то еще удовольствие. Посему решили попробовать организовать нормальную БД. Однако порывшись в голове и наличной литературе, я понял, что не представляю как организовываются подобные хранилища, а соответственно и запрограммировать не смогу. Собственно вопрос - подскажите куда двигаться. Использовать готовые СУБД не очень хочется по причине их платности. Если кто знает свободно распространяемые СУБД - подскажите, пжст.
|
|
Зарегистрирован |
http://www.aap13.narod.ru И пули, что найдет тебя, Ты не услышишь, А остальные мимо пролетят
|
|
|
Zed [SIG edition ;)]
A.I.M.Director
Была такая игра Z
Пол: Репутация: +532
|
|
Re: Базы данных « Ответ #1 от 21.02.2009 в 12:20:19 » |
|
2Artem13: Подавился чаем... http://ru.wikipedia.org/wiki/MySQL если что то несильно большое http://ru.wikipedia.org/wiki/PostgreSQL Если потолще.
|
« Изменён в : 21.02.2009 в 12:20:43 пользователем: Zed » |
Зарегистрирован |
Кровавый ГБист, душитель свободы.
|
|
|
Artem13 [13-й воин]
Прирожденный Джаец
Ап, и черти у ног моих сели...
Пол: Репутация: +441
|
|
Re: Базы данных « Ответ #2 от 21.02.2009 в 15:15:40 » |
|
2Zed: Спасибо. Попробую разобраться
|
|
Зарегистрирован |
http://www.aap13.narod.ru И пули, что найдет тебя, Ты не услышишь, А остальные мимо пролетят
|
|
|
Korchy [Непреодолимая сила]
Прирожденный Джаец
Ах, было б только с кем поговорить ...
Пол: Репутация: +663
|
|
Re: Базы данных « Ответ #3 от 11.07.2011 в 20:13:19 » |
|
Нужно построить обыкновенное дерево элементов. В базе данных соответственно 2 колонки id и sub_id. id - идентификатор узла, sub_id - к какому узлу цепляется текущий узел. В программе делается выборка и формируется дерево. Схематично говоря: while(все узлы) { узел = new узел(id); узел.прицепить(узел[sub_id]); } Возможен вариант (т.к. не известно в каком порядке все пихается в базу), когда узел с нужным sub_id еще не создан т.к. расположен в базе после узла, который к нему цепляется. Можно как-то обеспечить такой порядок узлов, чтобы исключить попытки прицепления к несозданному еще узлу? Или рациональнее просто делать в два цикла - первым создать все узлы, вторым сцепить их в нужном порядке?
|
« Изменён в : 11.07.2011 в 20:13:43 пользователем: Korchy » |
Зарегистрирован |
|
|
|
jarni [Гарный хлопец]
Прирожденный Джаец
Мне нечего сказать.
Пол: Репутация: +306
|
|
Re: Базы данных « Ответ #4 от 12.07.2011 в 01:07:15 » |
|
2Korchy: По-моему два прохода это не только самый рациональный но и единственно возможный способ.
|
|
Зарегистрирован |
Don't worry, be happy.
|
|
|
Korchy [Непреодолимая сила]
Прирожденный Джаец
Ах, было б только с кем поговорить ...
Пол: Репутация: +663
|
|
Re: Базы данных « Ответ #5 от 12.07.2011 в 01:21:09 » |
|
12.07.2011 в 01:07:15, jarni писал(a):но и единственно возможный способ |
| Да не, не единственный. Возможны варианты с созданием узла общего типа по sub_id с последующим его пересозданием в нужный тип. Или вызывать рекурсивный поиск вышестоящего узла при создании каждого дочернего. Но хочется найти более красивое решение. Два сканирования дерева я не отметаю только потому, что само дерево предполагается не из очень большого числа элементов. На вскидку в пределах двух трех сотен.
|
« Изменён в : 12.07.2011 в 01:21:38 пользователем: Korchy » |
Зарегистрирован |
|
|
|
jarni [Гарный хлопец]
Прирожденный Джаец
Мне нечего сказать.
Пол: Репутация: +306
|
|
Re: Базы данных « Ответ #6 от 12.07.2011 в 01:35:22 » |
|
2Korchy: Ок, не единственный, но все остальные по сложности скорее всего намного превысят 2n, где n это число элементов. Конечно это в случае что твоё дерево это дерево с абсолютно беспорядочными связями, то есть никакой логической иерархии. Потому что если бы последняя была то всё можно реализовать в один проход путём создания поддеревьев и последующим их слиянием по мере появления совместных узлов. Ещё мысль. Структура твоего дерево это точно только id и sub_id? Или каждый узел несёт с собой кучу свойств? Если это только id и sub_id, то всё элементарно: while(все узлы) { sub_node = nodes[sub_id]; if ( !sub_node ) { sub_node = new node(sub_id); nodes.add(sub_node); } node = new node(id); node.attach( sub_node ); nodes.add(node); }
|
|
Зарегистрирован |
Don't worry, be happy.
|
|
|
Korchy [Непреодолимая сила]
Прирожденный Джаец
Ах, было б только с кем поговорить ...
Пол: Репутация: +663
|
|
Re: Базы данных « Ответ #7 от 12.07.2011 в 01:42:18 » |
|
12.07.2011 в 01:35:22, jarni писал(a):Структура твоего дерево это точно только id и sub_id? Или каждый узел несёт с собой кучу свойств? |
| Кучу свойств. Узлы вообще разные по типу объекты, хотя и имеют общего предка. 12.07.2011 в 01:35:22, jarni писал(a):Конечно это в случае что твоё дерево это дерево с абсолютно беспорядочными связями, |
| Я вот думаю об этом. Т.к все в моих руках. Но в принципе я хочу менять узлы местами не трогая обрабатывающую программу а только меняя данные в базе. Так что наверное выходит совершенно беспорядочные.
|
« Изменён в : 12.07.2011 в 01:42:50 пользователем: Korchy » |
Зарегистрирован |
|
|
|
jarni [Гарный хлопец]
Прирожденный Джаец
Мне нечего сказать.
Пол: Репутация: +306
|
|
Re: Базы данных « Ответ #8 от 12.07.2011 в 01:53:33 » |
|
2Korchy: А ты не хочешь отделить структуру дерева от данных? В базе остаётся всё как есть, но в памяти у тебя будут элементы дерева вида: struct node { node * parent; node_data * data; } Тогда дерево создаёшь так как я написал выше (с модификацией на присоединение данных), а данные заливаешь по мере их прочтения. while(all_nodes) { sub_node = nodes[sub_id]; if ( !sub_node ) { //! sub_node ещё нету, значит создаём элемент дерева без данных, данные прибудут тогда когда мы этот sub_node прочитаем как node sub_node = new node(sub_id); nodes.add(sub_node); } //! Берём node, если его ещё нет, значит создаём. Если же он есть, то значит он был создан раньше как sub_node и нам остаётся только заполнить его данными node = nodes[id]; if ( !node ) { node = new node(id); } node.attach_data(data); node.attach( sub_node ); nodes.add(node); }
|
« Изменён в : 12.07.2011 в 02:05:24 пользователем: jarni » |
Зарегистрирован |
Don't worry, be happy.
|
|
|
Korchy [Непреодолимая сила]
Прирожденный Джаец
Ах, было б только с кем поговорить ...
Пол: Репутация: +663
|
|
Re: Базы данных « Ответ #9 от 12.07.2011 в 01:57:20 » |
|
12.07.2011 в 01:53:33, jarni писал(a):Тогда дерево создаёшь так как я написал выше (с модификацией на присоединение данных), а данные заливаешь по мере их прочтения. |
| Так все равно тогда два прохода получается. Первый на создание дерева, второй на заполнение данными.
|
|
Зарегистрирован |
|
|
|
jarni [Гарный хлопец]
Прирожденный Джаец
Мне нечего сказать.
Пол: Репутация: +306
|
|
Re: Базы данных « Ответ #10 от 12.07.2011 в 02:02:06 » |
|
2Korchy: Смотри предыдущий пост, я добавил код. Проход один. В каждой итерации создаёшь или используешь существующий sub_node, и создаёшь или берёшь существующий node и заполняешь его данными, а также устанавливаешь связь.
|
|
Зарегистрирован |
Don't worry, be happy.
|
|
|
Korchy [Непреодолимая сила]
Прирожденный Джаец
Ах, было б только с кем поговорить ...
Пол: Репутация: +663
|
|
Re: Базы данных « Ответ #11 от 12.07.2011 в 02:06:38 » |
|
12.07.2011 в 02:02:06, jarni писал(a):Смотри предыдущий пост, я добавил код |
| Ага, написал ответ до того как ты внес изменения Нет, такой подход не получится т.к. в информации об узле не содержится типа узла, к которому этот узел привязывается, известен только id. Можно конечно его закинуть туда, но тогда придется это держать в голове и при правке структуры дерева в базе править не только два поля id и sub_id но и еще и поле с типом sub_id. У меня это вот так примерно выглядит: <Root> <Type1 desc="type1"> <id>1</id> <sub_id>0</sub_id> <s_point_x>500</s_point_x> <s_point_y>300</s_point_y> <name>17</name> <img_path>img/graphic</img_path> <img_ext>png</img_ext> </Type1> <Type2 desc="type2"> <id>2</id> <sub_id>1</sub_id> <center_x>25</center_x> <center_y>25</center_y> <name>15</name> <img_path>graphic/</img_path> <img_ext>png</img_ext> </Type2> ... </Root> Скан, соответственно, идет по Type Создается объекты node = new Type1() // Type2 и т.д.
|
« Изменён в : 12.07.2011 в 02:14:23 пользователем: Korchy » |
Зарегистрирован |
|
|
|
jarni [Гарный хлопец]
Прирожденный Джаец
Мне нечего сказать.
Пол: Репутация: +306
|
|
Re: Базы данных « Ответ #12 от 12.07.2011 в 02:30:57 » |
|
2Korchy: Хм, отдели тогда дерево от данных полностью. Опять же, в базе всё остаётся как есть. Если я правильно понимаю, все узлы имеют общего предка, через которого к ним осуществляется доступ. class Shape; class Cube : public Shape; class Sphere : public Shape; Узел дерева тогда будет выглядеть как struct node { node * parent; Shape * data; } Если я понимаю правильно, когда ты читаешь узел, ты знаешь его тип, но не знаешь тип субузла. Но с выше описанной структурой заполнение данными происходит только тогда когда у тебя есть в руках тип. while(all_nodes) { sub_node = nodes[sub_id]; if ( !sub_node ) { //! sub_node ещё нету, значит создаём элемент дерева без данных, данные прибудут тогда когда мы этот sub_node прочитаем как node sub_node = new node(sub_id); nodes.add(sub_node); } //! Берём node, если его ещё нет, значит создаём. Если же он есть, то значит он был создан раньше как sub_node и нам остаётся только заполнить его данными node = nodes[id]; if ( !node ) { node = new node(id); } //! Создаём данные исходя из типа, который в данный момент известен. Работаем с типом предком, общим типом. Shape * data = ShapeFactory::Create( id_type ); node.attach_data(data); node.attach( sub_node ); nodes.add(node); }
|
« Изменён в : 12.07.2011 в 02:32:36 пользователем: jarni » |
Зарегистрирован |
Don't worry, be happy.
|
|
|
Korchy [Непреодолимая сила]
Прирожденный Джаец
Ах, было б только с кем поговорить ...
Пол: Репутация: +663
|
|
Re: Базы данных « Ответ #13 от 12.07.2011 в 02:47:14 » |
|
Чего-то у меня голова совсем не варит. Вот в этом куске //! sub_node ещё нету, значит создаём элемент дерева без данных, данные прибудут тогда когда мы этот sub_node прочитаем как node sub_node = new node(sub_id); nodes.add(sub_node); // <------- ? sub_node куда цепляется? В корень дерева?
|
|
Зарегистрирован |
|
|
|
jarni [Гарный хлопец]
Прирожденный Джаец
Мне нечего сказать.
Пол: Репутация: +306
|
|
Re: Базы данных « Ответ #14 от 12.07.2011 в 02:54:38 » |
|
2Korchy: Я без понятия какая у тебя структура данных используется для хранения узлов. Я исходил из твоего кода 11.07.2011 в 20:13:19, Korchy писал(a):узел.прицепить(узел[sub_id]); |
| . То есть я подумал что у тебя есть что-то вроде поля индексируемого с помощью id. Этот же вывод я сделал из фразы 11.07.2011 в 20:13:19, Korchy писал(a):первым создать все узлы, вторым сцепить их в нужном порядке |
| из которой следует что до у тебя есть хранилище в которое ты положишь все узлы до того пока не свяжешь их между собой.
|
|
Зарегистрирован |
Don't worry, be happy.
|
|
|
|