Лучший способ разработать масштабируемую систему хитов/аналитики?

До тех пор, пока p + i (для любого i, положительного или отрицательного) не выходит за пределы в любом направлении (т. Е. Оно не указывает до tab[0] или после tab[n - 1] в вашем примере) тогда все в порядке.

И помните, что для любого указателя или массива p и индекса i выражение *(p + i) равно точно , равно p[i].


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

Пример:

int tab[N];  // Exact value of N is irrelevant
int *p = tab;  // Equal to p = &tab[0]

p--;  // After this, p will be pointing out of bounds, this is okay

// Comparing pointers is okay
if (p < tab)
{
    /* ... */
}

printf("Value of *p = %d\n", *p);  // ERROR: Here you dereference the ouf-of-bounds pointer
8
задан 12 April 2009 в 17:16
поделиться

4 ответа

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

С 30-минутными сегментами, если пользователь запрашивает ежечасные данные за 1-2 часа с -4.5 UTC, вы можно получить данные за 5:30 - 18:30 из вашей системы и показать это. Если вы храните данные с шагом в один час, вы не сможете обслуживать запросы пользователей в часовых поясах с разницей в N + 0,5 часа.

Для ежедневных номеров вам нужно будет объединить 48 получасовых интервалов. Слоты для выбора будут определяться часовым поясом пользователя.

Это становится интересным, когда вы получаете годовые данные, потому что вам в итоге приходится собирать 17 520 получасовых сегментов. Чтобы упростить это вычисление, я бы предложил вам получить предварительно агрегированные годовые данные за время UTC и вычесть агрегированные данные за первые 4,5 часа в году и добавить агрегированные данные за первые 4,5 часа следующего года. Это существенно сместит весь год на 4,5 часа, и работа не так уж и велика. Работая отсюда, вы можете настроить систему дальше.

РЕДАКТИРОВАТЬ: Оказывается, что Катманду +5,45 по Гринвичу, поэтому вам нужно будет хранить данные в 15-минутных, а не 30-минутных.

РЕДАКТИРОВАТЬ 2: Другой Легкое улучшение заключается в агрегировании годовых данных, поэтому вам не нужно каждый раз добавлять 17 520 групп, не требуя одного агрегата на страну. Объедините годовые данные за период с 2 января по 30 декабря. Поскольку максимальная разница между часовыми поясами между любыми двумя странами составляет 23 часа, это означает, что вы можете взять годовые данные (02 января - 30 декабря) и добавить несколько интервалов до и после по мере необходимости. Например, для часового пояса -5 UTC вы должны добавить все сегменты 01 января после 05:00, все сегменты 31 декабря и 01 января следующего года до 05:00.

4
ответ дан 5 December 2019 в 22:20
поделиться

При разработке программного обеспечения, которое касается нескольких часовых поясов, я бы сказал, чтобы всегда сохранять вашу дату / время в UTC с другим полем для исходного часового пояса и функцией, которая берет время и преобразует его в UTC / часовой пояс и обратно. Вы избавите себя от множества проблем, связанных с различными случаями перехода на другой день, переходом на летнее время, людьми, которые смотрят статистику из другой страны и т. Д.

В вашем случае, имея Кэши в UTC и просто настройка запросов, которые будут конвертированы в UTC, должны помочь. Не храните статистику как «сегодня», сохраняйте ее для часов 00: 00: 00UTC до 23: 59: 59UTC, и когда кто-то запрашивает статистику за сегодня в Нью-Йорке, сделайте преобразование.

2
ответ дан 5 December 2019 в 22:20
поделиться

данные такого типа обычно хранятся с использованием циклических или циклических баз данных. проверьте это http://www.shinguz.ch/MySQL/mysql_20070223.html и это http://techblog.tilllate.com/2008/06/22/round-robin-data- хранилище в mysql / , чтобы знать, как они работают и как реализовать его в MySQL

0
ответ дан 5 December 2019 в 22:20
поделиться

As Насколько я понимаю, вы ищете здесь часть хранилища системы хранилища данных (ваши отчеты были бы внешним интерфейсом).

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

Тем не менее, я бы предложил «

0
ответ дан 5 December 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: