A.I.M.(http://forum.ja2.su/cgi-bin/yabb/YaBB.pl)
Генерал >> Ъ и Ь >> Базы данных
(Message started by: Artem13 на 21.02.2009 в 11:34:21)

Заголовок: Базы данных
Прислано пользователем 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:
Структура твоего дерево это точно только id и sub_id? Или каждый узел несёт с собой кучу свойств?

Кучу свойств. Узлы вообще разные по типу объекты, хотя и имеют общего предка.


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:
узел.прицепить(узел[sub_id]);
. То есть я подумал что у тебя есть что-то вроде поля индексируемого с помощью id. Этот же вывод я сделал из фразы  
on 1310404399, Korchy wrote:
первым создать все узлы, вторым сцепить их в нужном порядке
из которой следует что до у тебя есть хранилище в которое ты положишь все узлы до того пока не свяжешь их между собой.



A.I.M. » Powered by YaBB Modification 4 (v.4.0.0-pre)!
YaBB © 2000-2003. All Rights Reserved.