A.I.M. Jagged Alliance2

Добро пожаловать, Гость. Пожалуйста, выберите:
Вход || Регистрация.
28.03.2024 в 21:58:42

Главная Главная Помощь Помощь Поиск Поиск Участники Участники Вход Вход Регистрация Регистрация
A.I.M. « Базы данных »
   A.I.M.
   Генерал
   Ъ и Ь
(Модераторы: Zed, Снайпер, cha)
   Базы данных
« Предыдущая Тема | Следующая Тема »
  Тема:  Базы данных             Страниц: 1 Прочитано 2273 раз
Artem13
[13-й воин]
Прирожденный Джаец

Ап, и черти у ног моих сели...


WWW Ё-мэйл

Пол:
Репутация: +441
Базы данных
« от 21.02.2009 в 11:34:21 »

На работе возникла необходимость создать базу данных, в которой содержались бы сведения о производимых/разрабатываемых приборах, клиентах, отказах и т.п., причем не только простые текстовые записи, но и ссылки на документы, сканы и прочую графику. Сначала хотели тупо использовать Эксель, но работать с документами офиса по сети - то еще удовольствие. Посему решили попробовать организовать нормальную БД. Однако порывшись в голове и наличной литературе, я понял, что не представляю как организовываются подобные хранилища, а соответственно и запрограммировать не смогу.
Собственно вопрос - подскажите куда двигаться. Использовать готовые СУБД не очень хочется по причине их платности. Если кто знает свободно распространяемые СУБД - подскажите, пжст.
Зарегистрирован

Artem13.gif
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-й воин]
Прирожденный Джаец

Ап, и черти у ног моих сели...


WWW Ё-мэйл

Пол:
Репутация: +441
Re: Базы данных
« Ответ #2 от 21.02.2009 в 15:15:40 »

2Zed: Спасибо. Попробую разобраться
Зарегистрирован

Artem13.gif
http://www.aap13.narod.ru
И пули, что найдет тебя,
Ты не услышишь,
А остальные мимо пролетят

Korchy
[Непреодолимая сила]
Прирожденный Джаец

Ах, было б только с кем поговорить ...


WWW Ё-мэйл

Пол:
Репутация: +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 » Зарегистрирован

ban.gif
jarni
[Гарный хлопец]
Прирожденный Джаец

Мне нечего сказать.


Ё-мэйл

Пол:
Репутация: +306
Re: Базы данных
« Ответ #4 от 12.07.2011 в 01:07:15 »

2Korchy: По-моему два прохода это не только самый рациональный но и единственно возможный способ.
Зарегистрирован

Don't worry, be happy.
Korchy
[Непреодолимая сила]
Прирожденный Джаец

Ах, было б только с кем поговорить ...


WWW Ё-мэйл

Пол:
Репутация: +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 » Зарегистрирован

ban.gif
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
[Непреодолимая сила]
Прирожденный Джаец

Ах, было б только с кем поговорить ...


WWW Ё-мэйл

Пол:
Репутация: +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 » Зарегистрирован

ban.gif
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
[Непреодолимая сила]
Прирожденный Джаец

Ах, было б только с кем поговорить ...


WWW Ё-мэйл

Пол:
Репутация: +663
Re: Базы данных
« Ответ #9 от 12.07.2011 в 01:57:20 »

12.07.2011 в 01:53:33, jarni писал(a):
Тогда дерево создаёшь так как я написал выше (с модификацией на присоединение данных), а данные заливаешь по мере их прочтения.

Так все равно тогда два прохода получается. Первый на создание дерева, второй на заполнение данными.
Зарегистрирован

ban.gif
jarni
[Гарный хлопец]
Прирожденный Джаец

Мне нечего сказать.


Ё-мэйл

Пол:
Репутация: +306
Re: Базы данных
« Ответ #10 от 12.07.2011 в 02:02:06 »

2Korchy: Смотри предыдущий пост, я добавил код. Проход один. В каждой итерации создаёшь или используешь существующий sub_node, и создаёшь или берёшь существующий node и заполняешь его данными, а также устанавливаешь связь.
Зарегистрирован

Don't worry, be happy.
Korchy
[Непреодолимая сила]
Прирожденный Джаец

Ах, было б только с кем поговорить ...


WWW Ё-мэйл

Пол:
Репутация: +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 » Зарегистрирован

ban.gif
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
[Непреодолимая сила]
Прирожденный Джаец

Ах, было б только с кем поговорить ...


WWW Ё-мэйл

Пол:
Репутация: +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 куда цепляется? В корень дерева?
Зарегистрирован

ban.gif
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.
Страниц: 1  Послать Тему Послать Тему Печатать Печатать

« Предыдущая Тема | Следующая Тема »

Статистика. Размер данных: 56307 GZip: off
A.I.M. » Powered by YaBB Modification 4 (v.4.0.0-pre)!
YaBB © 2000-2003. All Rights Reserved.