LINUX.ORG.RU

Реализация БД


0

1

Создал базу для тестирования теорий, есть БД и в ней 2 таблицы 1на с данными а вторая с индексами(ключами), не знаю как правильно. ее размер просто огромной я говорю про десятки Гб. проблема с выборкой, есть 17 параметров, каждый последующий зависит от предыдущего. По этому получается очень большое количество вложенных циклов с SQL запросами. Потому что надо учитывать все изменения предыдущий выборки. Первая БД делаю для себя, кажись перестарался. Как с простить запрос или может надо по другому проектировать структуру?

Ответ на: комментарий от true_admin

Структура
http://img831.imageshack.us/img831/9188/34678526.png

Выборка в программе
http://img577.imageshack.us/img577/1646/testviborkapr.png

Выборка в программе при выводе гистограммы
http://img87.imageshack.us/img87/2179/testviborka.png

Пример кода

if CheckBox_high_low.Checked=true then begin
        if profit_transaction=1 then begin
           for index_hihg_low:=0 to 1 do begin
               if Form9.CheckListBox1.checked[index_hihg_low]=true then begin
                  for index_hour:=0 to 6 do begin
                      if Form8.CheckListBox1.checked[index_hour]=true then begin
                         if index_hour=0 then begin
                            hour_start:='9:31:00';
                            hour_finish:='10:30:59';
                         end;
                         if index_hour=1 then begin
                            hour_start:='10:31:00';
                            hour_finish:='11:30:59';
                         end;
                         if index_hour=2 then begin
                            hour_start:='11:31:00';
                            hour_finish:='12:30:59';
                         end;
                         if index_hour=3 then begin
                            hour_start:='12:31:00';
                            hour_finish:='13:30:59';
                         end;
                         if index_hour=4 then begin
                            hour_start:='13:31:00';
                            hour_finish:='14:30:59';
                         end;
                         if index_hour=5 then begin
                            hour_start:='14:31:00';
                            hour_finish:='15:00:59';
                         end;
                         if index_hour=6 then begin
                            hour_start:='15:01:00';
                            hour_finish:='16:00:00';
                         end;
                         for index_day:=1 to 31 do begin
                             if Form6.CheckListBox1.checked[index_day]=true then begin;
                                for index_month:=1 to 12 do begin
                                    if Form5.CheckListBox1.Checked[index_month]=true then begin
                                       for index_year:=0 to Form2.CheckListBox1.count-1 do begin
                                           if Form2.CheckListBox1.Checked[index_year]=true then begin
                                              ADOQuery1.SQL.Clear;
                                              ADOQuery1.SQL.Add('SELECT SUM(Profit) AS Sum_profit FROM report Where');
                                              ADOQuery1.SQL.Add('((year='''+Form2.CheckListBox1.Items[index_year]+'''))');
                                              ADOQuery1.SQL.Add('and (month='''+IntToStr(index_month)+''')');
                                              ADOQuery1.SQL.Add('and (day='''+Form6.CheckListBox1.Items[index_day]+''')');
                                              ADOQuery1.SQL.Add('and (time between '''+hour_start+''' and '''+hour_finish+''')');
                                              ADOQuery1.SQL.Add('and (HighLow='''+IntToStr(index_hihg_low+1)+''')');
                                              ADOQuery1.Active:=true;
                                              ADOQuery1.First;
                                              Sum_profit[index_hihg_low]:=Sum_profit[index_hihg_low]+ADOQuery1.FieldValues['Sum_profit'];
                                           end;
                                       end;
                                    end;
                                end;
                             end;
                         end;
                      end;
                  end;
               end;
           end;
           Form9.Show;
           Form9.Caption:='óñòîãðàìà ïðèáóòêó ïî High/Low';
           Form9.Chart1.Series[0].Clear;
           for index_hihg_low:=0 to 1 do begin
               chart_x:=index_hihg_low+1;
               chart_y:=sum_profit[index_hihg_low];
               Form9.Chart1.Series[0].AddXY(chart_x,chart_y);
           end;
        end;

chocolat
() автор топика
Ответ на: комментарий от duck

Если верить типу БД указанной на ER-диаграмме, то речь идет про MySQL. Там есть типы полей для работы с датой: DATETIME и TIMESTAMP, используйте их, это возможно и сократит, хоть и не значительно, размеры БД. НУ и функций по работе с годом/месяцем/часами/минутами и различными интервалами в mysql достаточно.

duck
()
Ответ на: комментарий от duck

DATETIME и TIMESTAMP да есть :

  • DATE 3 байта
  • DATETIME 8 байтов
  • TIMESTAMP 4 байта

Поля в базе по дате TINYINT - 1 byte, кроме времени TIME 3 байта, тоже самое по размеру. Вопрос, как улучшить выборку?

chocolat
() автор топика
Ответ на: комментарий от chocolat

На счет улучшения выборки: Вместо использования кучи циклов нужен зарос с группировкой и условие на интервал дат

duck
()
Ответ на: комментарий от duck

Проблема в том что, заранее я не знаю что нужно. Для этого и есть выборка, по годам чтоб увидеть картину в целом, потом по месяцам, вплоть до часа, уже снимая добавляя галочки я опускаюсь ниже по выборке пока не нахожу то что ищу.

chocolat
() автор топика
Ответ на: комментарий от chocolat

Ну в таком случае надо Дефолтный запрос: группировка по годам без условия

Дальше, в зависимости от выбранных чекбоксов/значений менять условие и группировку, например - все записи за сегодня, группировкп по часам.

Самоп главное это никаких циклов, для это есть база с ее возможномтями.

Если сделаешь все правильно, у тебя будет 1 запрос на выборку.

duck
()

between для дат вроде никто не отменял, хотя было это на аксесе и фокс про, в мускуле обязательно должно быть(хотя может и по другому называться), если данных ооооочень много - партицирование по дате тебе в руки

TOXA ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.