Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Как лучше сделать структуру таблицы


Автор: lemniscate 14.5.2012, 13:36
Добрый день уважаемые форумчане! Обращаюсь с такой просьбой, помогите правильно (т.е. как можно проще) организовать структуру данных в mysql и вывод их в php 

в конечном итоге надо получить html-таблицу следующего вида.
Код

<table>
<tr>
 <td rowspan=3>Всего по всем источникам</td>
 <td rowspan=3>Всего по бюджету</td>
 <td colspan=5>в том числе</td>
</tr>

<tr>
 <td rowspan=2>Субсидия по ГЗ</td>
 <td colspan=3>в том числе</td>
 <td rowspan=2>Целевая субсидия</td>
</tr>
<tr>
 <td>Услуги</td>
 <td>Хоз.</td>
 <td>Имущество</td>
</tr>
</table>


http://s2.ipicture.ru/

таблица состоит из источников финансирования, и структура этих источников находится в постоянном изменении. Например могут убрать подисточники, могут источник целиком и т.д. у каждой организации разные источники. Т.е. структура таблицы плавающая. К тому же количество подисточников также варьируется на "глубину", т.е. не известно сколько их может быть, например субсидия по ГЗ это подисточник бюджета, а услуги это источник субсидии на ГЗ. Может произойти так что и у услуги появятся свои подисточники и т.д.

Это маленький кусочек из огромной таблицы. Экономисты раньше вели его в excele, что крайне не удобно. 
Вообщем, конкретно в данном примере, колонки - Услуги, Хоз., Имущество и Целевая субсидия - колонки которые содержат конкретные значения. а Колонки Всего по всем..., Всего по бюджету, Субсидия по ГЗ это колонки с суммами и эти суммы, думаю лучше и не хранить в бд, а суммировать при выводе.  

Подскажите как правильно организовать структуру хранения в бд этих данных. Пока думаю сделать чтобы в одной таблице хранился список всех источников и подисточников, при это в каждой строке указывалось к ид какого источника относится данный подисточник. ну например что то в этом роде: 
http://s2.ipicture.ru/ 
где поле plan_src_sub_id и есть указатель на своего "родителя" т.е. к какому источнику относится. Но берут меня сомнения по поводу этого способа. 

Прошу помочь как сделать лучше? 

Автор: vlproject 27.5.2012, 22:35
Цитата

где поле plan_src_sub_id и есть указатель на своего "родителя" т.е. к какому источнику относится. Но берут меня сомнения по поводу этого способа. 


Именно так и надо хранить, ведь у каждого источника есть: 
  • свой id
  • свое название
  • id источника-родителя (если такового нет, то 0)

Только при удалении источника не забывайте проверять, есть ли у него дети (из по хорошему тоже удалять надо)

Автор: lemniscate 7.6.2012, 10:06
Ок, спасибо! так и сделал. 
 Сделал вот такую функцию. 
Код

function read_arr($arr, $n = false){

    static $count = 0;
    
    while(list($k, $v) = each($arr[$n])){

        if(is_array($arr[$v])){ 
                            
               $l .= "<td>".$v."</td>".read_arr($arr, $v);
            
        }

        else{                
            
                $l .= "<td>".$v."</td>";            
            
        }        
    
    }

    return $l;

}


Но вот ни как не могу сообразить, как сделать так чтобы данная функция строила таблицу в том виде которая необходима как в первой теме? Т.е. чтобы все "дочки" были под строкой 'в том числе'.

Автор: lemniscate 25.6.2012, 07:38
неужели никто не знает как? :( 

Автор: MaXL 26.6.2012, 07:23
Цитата
где поле plan_src_sub_id и есть указатель на своего "родителя" т.е. к какому источнику относится. Но берут меня сомнения по поводу этого способа. 

а в вашей структуре могут быть циклы ? т.е. может у какой-то записи быть два родителя ?

lemniscate функцию выводящую это писать лениво. использование рекурсии правильный подход, но может быть стоит пользоваться на colspan и rowspan, а вставлять дополнительные таблицы, содержащие подисточники, т.е. что-то типо:
Код

<table>
  <tr>
    <td rowspan="2">Субсидия по ГЗ</td>
    <td>
      В том числе
      <table>
        <tr>
          <td>Хоз</td>
          <td>Имущество</td>
          <td>...</td>
        </tr>
      </table>
    </td>
  </tr>
</table>

т.е. если есть дочернии, то прописываешь rowspan="2" и рекурсивно вызываешь себя.

Автор: lemniscate 26.6.2012, 09:12
тогда другой вопрос, если сделать все дочерние элементы в отдельную таблицу то как размеры ячеек вложенной таблицы согласуются с размеры тех данных которые будут ниже, а там может быть более сотни строк содержащие значения ... 

Автор: MaXL 30.6.2012, 17:40
не понял.
ячейка же будет растягиваться, под своё содержимое.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)