Интерполяция по двум таблицам

korel

Новичок
Интерполяция по двум таблицам

Необходимо сделать примерно такое, как указано здесь:
http://www.experts-exchange.com/Database/MySQL/Q_22140133.html

Но! Учитывая, что значение х - это не одно единичное значение, а список значений.
Не могу решить, как лучше быть. Есть три варианта:

1) выгрузить в пхп из одной таблицы значения х_real в массив, выгрузить всю таблицу из примера и средствами пхп найти интервал в который входит каждое значение x_real.

2) сделать 3 селекта, которые описаны в ответах: а) выгрузка значений-х_real б) выгрузка нижней границы интервала x1 (и соответствующий y1) в) выгрузка верхней границы интервала x2 (и соответствующий y2), а затем ещё пройти оператором цикла по каждому значению x_real и вычислить реальное значение y_real (получится всё тот же массив из реальных игриков).

3) добавить в таблицу ху ещё 2 поля (в xy будут теперь такие поля: x1, y1, x2, y2), в котором, если брать построчно, пары [x1, x2], будут принимать значения [10, 20] [20, 30] [30, 40] [40, 50] . Далее можно сделать такой селект select x.x_real, xy.x1, xy.x2, xy.y1, xy.y2 from x LEFT JOIN ху ON x_real beetween (xy.x1, xy.x2).
Как понимаете из такого сделать интерполяцию - пара пустяков.
Что посоветуете? Какой вариант больше подходит, если приоритетным параметром выбора является скорость обработки данных?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
многа букав
а по-русски нельзя? а то непонятно что такое "выгрузить значения х_real", откуда берутся интервалы, в которых надо искать и т.п.
 

korel

Новичок
есть две таблицы x и xy
Таблица x
id x_real
1 10
2 15
3 25
4 20
5 35
6 30

Таблица xy
id x y
1 10 676
2 20 800
3 30 1100
4 40 1200
5 50 1000

Данных в таблице х - может быть на много больше (порядка нескольких тысяч).
Хочу провести интерполяцию, т.е. получить таблицу y вида
id y_real
1 676
2 950
3 800
4 1150
5 1100
6 1100
Значение y высчитывается по формуле:
y_real=(x_real-x1)*(y2-y1)/(x2-x1)+y1
Где x1,x2 - интервал между которым находится значение x_real, а y1,y2 - значения y, соответствующие x1,x2.
Пример:
y_real(id=2)=((25-20)*(1100-800)/(30-20))+800=950

Вопрос: как это сделать быстрее всего?

-~{}~ 21.05.09 10:59:

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

Alexandre

PHPПенсионер
вариант 1 - средствами пхп на клиенте (самое простое)
все вытягиваешь в массив и проводишь свою экстрополяцию
несколько тысяч записей - это вполне нормально и пхп потянеет,
в крайнем случае можно разбить закачку и обработку поблочно (например по 5 тыс записей).

вариант 2 - написать SP с использованием курсора (http://dev.mysql.com/doc/refman/5.0/en/cursors.html)
 

findnext

Новичок
подобные действия нужно выполнять на уровне бд, если бд это позволяет.
 

korel

Новичок
дело в том, что значения х - активно пополняются. Было вынесено решение, что интерполироваться данные будут налету, ещё при записи в БД, но до того как данная программа будет написана и запущена (она может писаться год и более), от меня требуют сделать эту интерполяцию средствами mysql и пхп. Так вот у меня и возник с этим вопрос - как будет быстрее:
1) когда мы полностью выгружаем данные в память и обрабатываем их с помощью пхп
2) когда мы частично подготавливаем данные, использую средства бд, чтобы завершить обработку данных уже в пхп
3) когда преобразование происходит польностью в бд, выдавая нужный результат.
 

findnext

Новичок
korel
быстрее будет сделать на уровне бд т.е 3 пункт - когда преобразование происходит польностью в бд.

Тебе нужно знать что такое триггер, процедура, функция и курсор

-~{}~ 21.05.09 15:28:

+ результат выполнения можно засовывать во view, я так понимаю вычисления проводяться только 1 раз по формуле для каждой вставки в бд?
 

korel

Новичок
пока что, вычисления проводятся каждый раз, при запросе данных. Запрос может быть по разному периоду времени. Данные потом отображаются на графике.
 

dimagolov

Новичок
korel, если в вычислениях участвуют только две таблицы, то очевидно, что разные результаты будут только при их изменениях. то есть все можно считать в момент изменения данных и сохранять результат, а при отображении запрашивать сохраненный.

с точки зрения теории это называется денормализацией при оптимизации.
 

korel

Новичок
абсолютно согласна. Но сейчас нет возможности делать процедуру, фоновую программу или что-либо ещё, кроме денормализации БД. Т.к. во первых - нет человека который разбирается как написать эту процедуру, фоновую программу и пр. Во-вторых, разбираться в этом достаточно долго, а сделать очень просят на вчера.
 
Сверху