1

Я ищу некоторую помощь в отношении наилучшего способа структурирования данных в приложении ndb с помощью python, обработайте его и запросите позже. Я хочу хранить данные о температуре с почасовыми интервалами для разных географических регионов.Структурные данные в приложении engine ndb и ускорении запроса

Я могу представить два варианта сущности, но там может быть что-то намного лучше. Первым будет хранить почасовую температуру в индивидуальных свойствах:

class TempData(ndb.Model): 
    region = ndb.StringProperty() 
    date = ndb.DateProperty() 
    00:00 = ndb.FloatProperty() 
    01:00 = ndb.FloatProperty() 
    ... 
    23:00 = ndb.FloatProperty() 

Или я мог бы хранить данные

class TempData(ndb.Model): 
    region = ndb.StringProperty() 
    date = ndb.DateProperty() 
    time = ndb.TimeProperty() 
    temp = ndb.FloatProperty() 

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

Я хочу, чтобы иметь возможность запрашивать хранилище данных, чтобы рассчитать общую, максимальную, минимальную и среднюю температуру для любого заданного диапазона дат. В первом варианте я мог бы создать еще 4 свойства для эффективной предварительной обработки и хранения Total, Max и т. Д. Для каждого дня, поэтому, если бы я хотел запросить общую температуру в течение года, мне пришлось бы суммировать 365 значений, а не 8760 ? Я не уверен, как это сделать во втором варианте?

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

Благодаря

Пол

ответ

4

Лично я бы с вариантом первого подхода:

class TempData(ndb.Model): 
    region = ndb.StringProperty() 
    date = ndb.DateProperty() 
    temp = ndb.FloatProperty(repeated=True) 

используя temp список для хранения температуры от часа, чтобы, как вы узнаете о их. Я не думаю, что предварительная обработка per-date добавит что-то многое: чтобы вычислить все в течение года, вам все равно нужно будет избрать 365 объектов, и задержка для этого закроет крошечное количество времени, необходимое для подведения итогов тысячи номеров в любом случае.

В целом, предварительная обработка полезна, если вы хотите легко запросить новые поля, которые вы создаете с помощью такой обработки (например, быстро ответьте на вопрос «, в которых даты в локали X имели среднюю температуру более 20 градусов Цельсия»). Это не похоже на ваш прецедент.

В любом случае, если вам необходимо вычислять многомесячные значения, может быть более полезной предварительная обработка агрегатов в месяц (в более простые объекты TempDataMonth). Или, любой другой несколько дней, который вы найдете полезным, конечно (недели, десятидневные группы, что угодно). Они могут быть вычислены в фоновом задании, периодически проверяющем, какие такие периоды стали полными со времени последней проверки. Но это немного выходит за рамки вашего вопроса, поэтому я не разбираюсь в деталях.

Общая идея заключается в том, что минимизация количества объектов для извлечения является одной из самых важных оптимизаций; Разумеется, возможны и другие оптимизации, но они, как правило, играют вторую роль в этом :-).

+0

Спасибо Алекс, это имеет смысл. Что произойдет, если будет отсутствующее значение, могу ли я просто сохранить пустое значение для запроса по исключению позже? Будет ли способ запросить повторное свойство, чтобы получить максимальную температуру в 12:00 вечера, например? – Ron

+0

@Ron, вы можете сохранить 'float ('NaN')' в качестве держателя места для отсутствия данных.Конечно, если вы делаете арифметику на «NaN», в Python она распространяется, поэтому, если вы хотите получить максимальную или максимальную максимальную силу для даты с отсутствующими данными, вам придется отфильтровать «NaN's yourseif» в вашем Python код. Что касается «max temp at 12: 00», вам нужно будет сначала получить все соответствующие объекты, а затем использовать цикл Python для определения результата. Определение точно, какие запросы, которые вы будете использовать, часто нуждаются в быстром ответе, * важно * при использовании любая база данных NoSQL. –

+0

Спасибо, Алекс, я дам ему – Ron

Смежные вопросы