Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Кто как хранит бюджет(дерево)? / 11 сообщений из 11, страница 1 из 1
30.01.2006, 15:38
    #33511154
Павел_Щ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто как хранит бюджет(дерево)?
Всем привет!

Собсно сабж. Одновременно очень простая задача, и немножко "сложная". К сожалению я абсалютно не уверен что я сделал правильно. По сему интересует кто как это делает. Применительно к бюджету.
По сути интересны следующие моменты.
1. Структура базы.
2. Ввод бюджета/статей/подстатей/лимитов?
3. Чем и на каком этапе контролируется введённая сумма лимита?
4. Очень интересует как правильно сделать нумерацию статей и подстатей. Опять же как это контролировать?
5. Ну и собственно говоря отображение. В виде дерева или грида?

Например....
Сначала (понятное дело) создаём бюджет. Потом вводим статьи для бюджетов.
Например вводим стать номер "1". Вводим её лимит скажем 1000. Это говорит о том что сумма лимитов всех подстатей равна 1000. Теперь для первой статьи вводим подстатью "1.1" Водим её лимит. Вот тут я не могу определиться как делать контроль ввода "1.1"(и как это хранить в базе) ну и соответственно лимит как контролировать. И так далее.

Например я сделал так, наверно самый простой вариант, надо было сделать очень быстро, внешне работающее.
Таблица бюджетов(айди, название, примечание). Таблица статей(айди, айди парента, айди бюджета, лимит, номер статьи(текстовое поле), название, примечание). Они связанны один ко многим. Таблица статей завязана на себя(один ко многим). Что мене абсалютно не нравится(но как сделать не знаю) это хранение вот этого номера статьи, сейчас храниться как текст. При получении с базы такого-то бюджета я просто делаю ордербай по полю "номеру статьи" и Если всё введёно корректно, то понятное дело что всё показывается чётко. Лимиты пока опять же никак не контролирую. Первое что в голову пришло это сделать кнопку, типа првоерить на лимиты валидность. Обходить дерево и считать лимиты. Но думаю что это надо сделать по другому, ещё на этапе ввода отсекать неправильные суммы. Показываю в гриде.

Короче поделитись плиз правильной организацией дерева! Заранее сенкс!
...
Рейтинг: 0 / 0
30.01.2006, 20:18
    #33511951
PVP
PVP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто как хранит бюджет(дерево)?
Мне нравится дерево, организованное в одной таблице с обычной парой "код вершины", "Код родителя" и некоторыми долнительными полями для отображения и ускорения выборки из базы данных.
...
Рейтинг: 0 / 0
30.01.2006, 20:20
    #33511956
PVP
PVP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто как хранит бюджет(дерево)?
Почему то рисунок не приклеился. Попытка №2
...
Рейтинг: 0 / 0
30.01.2006, 20:23
    #33511958
PVP
PVP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто как хранит бюджет(дерево)?
Похоже, что не проходит рисунок.
...
Рейтинг: 0 / 0
31.01.2006, 10:46
    #33512629
Павел_Щ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто как хранит бюджет(дерево)?
PVPПохоже, что не проходит рисунок.
жаль...
...
Рейтинг: 0 / 0
31.01.2006, 11:47
    #33512871
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто как хранит бюджет(дерево)?
Павел_Щ
Хм. Имхо тема немного великовата, чтобы говорить о "правильно" и "неправильно" вообще, без конкретики. Например, сугубо от балды, чем Вас не устраивает следующее решение?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
SQL> create table Статьи (id integer not null primary key, value integer, limit integer,
   2     parent_id integer references Статьи (id));

Table created

SQL> insert into Статьи
   2   select  1 , null,  1000 , null from dual union all
   3   select  2 ,  100 , null,  1  from dual union all
   4   select  3 ,  200 ,  300 ,  1  from dual;

 3  rows inserted

SQL> create view ВключениеПодстатей as
   2   select c1.id ansector_id, c2.id descendant_id
   3   from Статьи c1, Статьи c2
   4   where c2.id in (select id from Статьи c3 start with c3.id = c1.id connect by prior id = parent_id);

View created

SQL> create view РасходыПоСтатьям as
   2   select c1.id, c1.limit, sum (c2.value) sum_values
   3   from Статьи c1, ВключениеПодстатей p, Статьи c2
   4   where c1.id = p.ansector_id and p.descendant_id = c2.id
   5   group by c1.id, c1.limit;

View created

SQL> select * from РасходыПоСтатьям where limit < sum_values;

                                     ID                                   LIMIT SUM_VALUES
--------------------------------------- --------------------------------------- ----------

SQL> insert into Статьи values ( 4 ,  1000 , null,  3 );

 1  row inserted

SQL> select * from РасходыПоСтатьям where limit < sum_values;

                                     ID                                   LIMIT SUM_VALUES
--------------------------------------- --------------------------------------- ----------
                                       1                                      1000         1300 
                                       3                                       300         1200 
...
Рейтинг: 0 / 0
31.01.2006, 11:52
    #33512900
Estets
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто как хранит бюджет(дерево)?
Ну во первых поиск по форуму со словом "дерево" даст исчерпывающую информацию кто и как деревья хранит.

В кратце, есть два подхода, тот что вы описали (ID - ParentID) и так называемые Целко(Селко) деревья, основанные на теории вложенных множеств. В одном из проектов я использовал оба подхода. Например наличие ParentID позволяет быстро отрисрвывать дерево "как дерево", а дополнительные ключи Целко позволяют например просуммировать одним запросом лимиты по всей ветке дерева, независимо от вложенности.

Павел_Щ Например вводим стать номер "1"... Теперь для первой статьи вводим подстатью "1.1

А по частным вопросам я бы предложил хранить два номера отдельно, один это реальный номер статьи(подстатьи), а другой "синтетический", собранный из номеров всех родительских записей, через разделитель.
Т.е. вности статью 1 - номер статьи 1 синтетический номер 1.
Вности подстатью - номер подстатьи 1 синтетический номер 1.1.
... подстатья третьего уровня, номер 59 синтетический номер 1.1.59.
...
Рейтинг: 0 / 0
31.01.2006, 16:33
    #33513837
Прохожий 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто как хранит бюджет(дерево)?
http://sdm.viptop.ru/articles/sqltrees.html

Занимательное чтиво. Рекомендую.
...
Рейтинг: 0 / 0
01.02.2006, 11:29
    #33515401
PVP
PVP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто как хранит бюджет(дерево)?
PVP Попытка №2 Попытка №3
...
Рейтинг: 0 / 0
01.02.2006, 11:32
    #33515409
PVP
PVP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто как хранит бюджет(дерево)?
PVP PVP Попытка №2 Попытка №3Последняя.
...
Рейтинг: 0 / 0
01.02.2006, 12:20
    #33515580
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто как хранит бюджет(дерево)?
Форум теряет рисунки, если перед оправкой жался "предпросмотр".
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Кто как хранит бюджет(дерево)? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]