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

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

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

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

Короче поделитись плиз правильной организацией дерева! Заранее сенкс!
...
Рейтинг: 0 / 0
Кто как хранит бюджет(дерево)?
    #33511951
Фотография PVP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нравится дерево, организованное в одной таблице с обычной парой "код вершины", "Код родителя" и некоторыми долнительными полями для отображения и ускорения выборки из базы данных.
...
Рейтинг: 0 / 0
Кто как хранит бюджет(дерево)?
    #33511956
Фотография PVP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему то рисунок не приклеился. Попытка №2
...
Рейтинг: 0 / 0
Кто как хранит бюджет(дерево)?
    #33511958
Фотография PVP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, что не проходит рисунок.
...
Рейтинг: 0 / 0
Кто как хранит бюджет(дерево)?
    #33512629
Павел_Щ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PVPПохоже, что не проходит рисунок.
жаль...
...
Рейтинг: 0 / 0
Кто как хранит бюджет(дерево)?
    #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
Кто как хранит бюджет(дерево)?
    #33512900
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну во первых поиск по форуму со словом "дерево" даст исчерпывающую информацию кто и как деревья хранит.

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

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

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

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


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