| ||||
Заголовок: Базы данных Прислано пользователем Artem13 на 21.02.2009 в 11:34:21 На работе возникла необходимость создать базу данных, в которой содержались бы сведения о производимых/разрабатываемых приборах, клиентах, отказах и т.п., причем не только простые текстовые записи, но и ссылки на документы, сканы и прочую графику. Сначала хотели тупо использовать Эксель, но работать с документами офиса по сети - то еще удовольствие. Посему решили попробовать организовать нормальную БД. Однако порывшись в голове и наличной литературе, я понял, что не представляю как организовываются подобные хранилища, а соответственно и запрограммировать не смогу. Собственно вопрос - подскажите куда двигаться. Использовать готовые СУБД не очень хочется по причине их платности. Если кто знает свободно распространяемые СУБД - подскажите, пжст. | ||||
Заголовок: Re: Базы данных Прислано пользователем Zed на 21.02.2009 в 12:20:19 2Artem13: Подавился чаем... http://ru.wikipedia.org/wiki/MySQL если что то несильно большое http://ru.wikipedia.org/wiki/PostgreSQL Если потолще. | ||||
Заголовок: Re: Базы данных Прислано пользователем Artem13 на 21.02.2009 в 15:15:40 2Zed: Спасибо. Попробую разобраться | ||||
Заголовок: Re: Базы данных Прислано пользователем Korchy на 11.07.2011 в 20:13:19 Нужно построить обыкновенное дерево элементов. В базе данных соответственно 2 колонки id и sub_id. id - идентификатор узла, sub_id - к какому узлу цепляется текущий узел. В программе делается выборка и формируется дерево. Схематично говоря: while(все узлы) { узел = new узел(id); узел.прицепить(узел[sub_id]); } Возможен вариант (т.к. не известно в каком порядке все пихается в базу), когда узел с нужным sub_id еще не создан т.к. расположен в базе после узла, который к нему цепляется. Можно как-то обеспечить такой порядок узлов, чтобы исключить попытки прицепления к несозданному еще узлу? Или рациональнее просто делать в два цикла - первым создать все узлы, вторым сцепить их в нужном порядке? | ||||
Заголовок: Re: Базы данных Прислано пользователем jarni на 12.07.2011 в 01:07:15 2Korchy: По-моему два прохода это не только самый рациональный но и единственно возможный способ. | ||||
Заголовок: Re: Базы данных Прислано пользователем Korchy на 12.07.2011 в 01:21:09 on 1310422035, jarni wrote:
Да не, не единственный. Возможны варианты с созданием узла общего типа по sub_id с последующим его пересозданием в нужный тип. Или вызывать рекурсивный поиск вышестоящего узла при создании каждого дочернего. Но хочется найти более красивое решение. Два сканирования дерева я не отметаю только потому, что само дерево предполагается не из очень большого числа элементов. На вскидку в пределах двух трех сотен. | ||||
Заголовок: Re: Базы данных Прислано пользователем jarni на 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); } | ||||
Заголовок: Re: Базы данных Прислано пользователем Korchy на 12.07.2011 в 01:42:18 on 1310423722, jarni wrote:
Кучу свойств. Узлы вообще разные по типу объекты, хотя и имеют общего предка. on 1310423722, jarni wrote:
Я вот думаю об этом. Т.к все в моих руках. Но в принципе я хочу менять узлы местами не трогая обрабатывающую программу а только меняя данные в базе. Так что наверное выходит совершенно беспорядочные. | ||||
Заголовок: Re: Базы данных Прислано пользователем jarni на 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); } | ||||
Заголовок: Re: Базы данных Прислано пользователем Korchy на 12.07.2011 в 01:57:20 on 1310424813, jarni wrote:
Так все равно тогда два прохода получается. Первый на создание дерева, второй на заполнение данными. | ||||
Заголовок: Re: Базы данных Прислано пользователем jarni на 12.07.2011 в 02:02:06 2Korchy: Смотри предыдущий пост, я добавил код. Проход один. В каждой итерации создаёшь или используешь существующий sub_node, и создаёшь или берёшь существующий node и заполняешь его данными, а также устанавливаешь связь. | ||||
Заголовок: Re: Базы данных Прислано пользователем Korchy на 12.07.2011 в 02:06:38 on 1310425326, jarni wrote:
Ага, написал ответ до того как ты внес изменения :) Нет, такой подход не получится т.к. в информации об узле не содержится типа узла, к которому этот узел привязывается, известен только 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 и т.д. | ||||
Заголовок: Re: Базы данных Прислано пользователем jarni на 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); } | ||||
Заголовок: Re: Базы данных Прислано пользователем Korchy на 12.07.2011 в 02:47:14 Чего-то у меня голова совсем не варит. Вот в этом куске //! sub_node ещё нету, значит создаём элемент дерева без данных, данные прибудут тогда когда мы этот sub_node прочитаем как node sub_node = new node(sub_id); nodes.add(sub_node); // <------- ? sub_node куда цепляется? В корень дерева? | ||||
Заголовок: Re: Базы данных Прислано пользователем jarni на 12.07.2011 в 02:54:38 2Korchy: Я без понятия какая у тебя структура данных используется для хранения узлов. Я исходил из твоего кода on 1310404399, Korchy wrote:
on 1310404399, Korchy wrote:
| ||||
A.I.M. » Powered by YaBB Modification 4 (v.4.0.0-pre)! YaBB © 2000-2003. All Rights Reserved. |