Структура базы данных для содержания статистики днем, неделя, месяц, год

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

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

Затем вы можете либо определить location для каждого приложения отдельно, либо определить одно общее местоположение, например,

# sample.conf
server {
  listen 80 default_server;
  server_name ~ (?.+);
  location ~ {
    # for actual request forwarding
    proxy_pass                         http://$docker_host_name$1$is_args$args;
    # some stuff I figured out I have to use in order for service to work properly
    proxy_set_header                   Upgrade $http_upgrade;
    proxy_set_header                   Connection 'upgrade';
    proxy_http_version                 1.1;
    proxy_cache_bypass                 $http_upgrade;
    proxy_set_header Host              $host;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

Эта конфигурация должна быть встроена в исходный /etc/nginx/nginx.conf или в отдельный файл. это входит в конфигурационный блок http.

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

Конечно, вы все равно должны хранить записи в файле hosts, поэтому ваш компьютер знает, что он должен обрабатывать запрос локально.

Редактировать:

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

# sample.conf
server {
  listen 80 default_server;
  location ~ {
    # for actual request forwarding
    proxy_pass                         http://$host$1$is_args$args;
    # some stuff I figured out I have to use in order for service to work properly
    proxy_set_header                   Upgrade $http_upgrade;
    proxy_set_header                   Connection 'upgrade';
    proxy_http_version                 1.1;
    proxy_cache_bypass                 $http_upgrade;
    proxy_set_header Host              $host;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

С этой конфигурацией сервер nginx будет прослушивать все входящие запросы через порт 80 и перенаправлять их в соответствующий контейнер. внутри сети. Вам также не нужно настраивать разрешение хоста самостоятельно, так как имена контейнеров докеров также представляют хост (-name) контейнера.

Надеюсь, это сработает для вас.

11
задан Abs 4 March 2009 в 13:59
поделиться

6 ответов

Вместо того, чтобы обновить количества в день, неделя и т.д. просто ВСТАВЛЯЕТ строку в таблицу каждый раз, когда действие происходит как это:

insert into activities (activity_date, activity_info) 
values (CURRENT_TIMESTAMP, 'whatever');

Теперь Ваши отчеты очень просты как:

select count(*) from activities
where activity_date between '2008-01-01' and '2008-01-07';

или

select YEARWEEK(`activity_date`) as theweek, count(*)
group by theweek
19
ответ дан 3 December 2019 в 03:05
поделиться

Можно просто добавить записи в таблицу и SELECT их использующий агрегатные функции.

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

CREATE TABLE aggregates (type VARCHAR(20), part VARCHAR(10) NOT NULL PRIMARY KEY, activity INT)

INSERT INTO aggregates (type, part, activity)
VALUES ('year', SUBSTRING(SYSDATE(), 1, 4), 1)
ON DUPLICATE KEY UPDATE activity = activity + 1

INSERT INTO aggregates (type, part, activity)
VALUES ('month', SUBSTRING(SYSDATE(), 1, 7), 1)
ON DUPLICATE KEY UPDATE activity = activity + 1

INSERT INTO aggregates (type, part, activity)
VALUES ('day', SUBSTRING(SYSDATE(), 1, 10), 1)
ON DUPLICATE KEY UPDATE activity = activity + 1

Это автоматически обновит существующие строки и вставит несуществующий при необходимости.

3
ответ дан 3 December 2019 в 03:05
поделиться
  1. таблица событий: идентификатор, идентификатор действия, дата и время, идентификатор пользователя.
  2. таблица пользователей: идентификатор, имя пользователя и т.д.
  3. таблица операций: идентификатор, имя действия, и т.д.

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

3
ответ дан 3 December 2019 в 03:05
поделиться

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

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

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

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

Ваше другое предложение состояло в том, чтобы агрегировать его от запуска, никогда не храня каждый хит как строку. Вы, вероятно, сделали бы это, как прежде, со строкой в течение каждого часа. Каждый хит увеличил бы строку соответствующих часов одной. У Вас только были бы данные в одном месте, и они будут уже вполне прилично получены в итоге.

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

2
ответ дан 3 December 2019 в 03:05
поделиться

Используйте дизайн схемы "звезда". (или возможно дизайн снежинки).

Дизайн схемы "звезда"

Вы закончите тем, что делали вставку в таблицу фактов для каждого нового действия. Посмотрите предложение Tony.

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

Ваш вопрос касается таблицы измерений периодов времени. Давайте назовем это "Альманахом". Выберите гранулярность. Скажем, день. Альманах поссорится в день. Первичный ключ может быть датой. Ваша таблица фактов должна включать этот первичный ключ как внешний ключ для создания соединений легче. (Не имеет значения, объявляете ли Вы это как внешний ключ. Та единственная ссылочная целостность влияния во время Вашего процесса обновления.)

Включайте столбцы в Альманах в течение каждого отчетного периода, о котором можно думать. Неделя, Месяц, Четверть, год, и т.д. Можно даже включать отчетные периоды, которые касаются собственного календаря компании.

Вот статья, сравнивающая ER и DM. Я необычен в этом, мне нравятся оба метода, выбирая соответствующий метод для соответствующей задачи.

http://www.dbmsmag.com/9510d05.html

1
ответ дан 3 December 2019 в 03:05
поделиться

Ответ Tony Andrews является самым простым, однако структура снежинки иногда используется в приложениях хранилищ данных: таблица, которая считает все операции, другого для операций в день, другого для операций в месяц и одну треть для операций в год. С этим видом структуры действие между любыми двумя датами может быть вычислено очень эффективно. https://en.wikipedia.org/wiki/Snowflake_schema

1
ответ дан 3 December 2019 в 03:05
поделиться
Другие вопросы по тегам:

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