Я строил это аналитическое веб-приложение с использованием MongoDB, и схема выглядит примерно так
uID: String,
day: Number,
totalHits: Number,
sites: [{
name: String,
hr: Number,
browser: {}
}]
Конечно, у меня будут другие поля, но пока у меня будет только информация браузера. Я хотел бы переключить свою базу данных на использование postgres, но я не уверен, как правильно настроить таблицу и как делать то, что я хочу сделать.
Представьте, что документы в настоящее время пусты и произнесите Пользователь зашел на сайт mysite.com
сегодня (4/11/2020 в 16:00) с браузером Chrome. В mongodb я бы использовал команду findOneAndUpdate
с upsert: true
. Сначала я проверил бы, существует ли документ там, где name = mysite.com
, day = 1586563200
и hr = 16
. Если такого документа не существует там, где он соответствует этим условиям, создайте документ с этими полями и увеличьте значение totalHits
на 1, добавьте ключ с именем chrome к объекту браузера и присвойте ему значение 1. Итак конечный результат будет иметь документ, похожий на этот
uID: someID,
day: 1586563200,
totalHits: 1,
sites: [{
name: mysite.com,
hr: 16,
browser: {Chrome: 1}
}]
Затем, скажем, еще один удар пришелся через час с браузером firefox, а другой пришел на следующий час на страницу входа с снова браузером с именем Melon
. Конечный результат будет выглядеть следующим образом:
uID: someID,
day: 1586563200,
totalHits: 3,
sites: [{
name: mysite.com,
hr: 16,
browser: {Chrome: 1, Firefox: 1}
},{
name: mysite.com/login,
hr: 17,
browser: {Melon: 1}
}]
Как вы можете сказать, я разбил данные на несколько дней и создал еще одно ведение за часы. Я сделал это, чтобы у меня не было такого большого количества данных, если бы у пользователя были сотни или тысячи посетителей каждый час. Я считаю, что это хороший способ организовать и структурировать данные в mon go, который бы неплохо масштабировался, если бы у меня была тонна записей. Конечно, я могу быть совершенно неправ, так как это первый раз, когда я делаю такой проект, поэтому, если есть лучший способ структурировать мои данные, у меня все уши!
Однако я не уверен, как go об этом в табличном смысле. Я предполагаю, что у меня будет таблица сайтов со столбцами uID, day, totalHits, name, hr, browser
, но это будет создавать новую строку каждый час, в то время как в понедельник go она разбивается на дни, и для каждого нового часа простой объект добавляется в sites
массив. Другое дело, что я не уверен, как бы я настроил колонку browser
. Я не хочу иметь столбец для каждого браузера и увеличивать его, потому что я не уверен, сколько браузеров существует. Я мог бы определить топ-10 браузеров и просто создать столбец с именем «Другие браузеры» и go через некоторые проверки на стороне сервера и сделать это, но я бы предпочел использовать это в качестве крайней меры, так как я хотел бы реалистично иметь точные информация, чем есть анонимный столбец с именем "Другое". Я также не совсем уверен в том, что сделать мой первичный ключ, вторичный, и т. Д. c. Я не знаю, могу ли я иметь первичный ключ, потому что ни один из этих столбцов не будет уникальным. Однако то, что БУДЕТ быть уникальным, это комбинация столбцов, то есть day + site name + hr
, поскольку для каждого часа будет создаваться новая строка, но только если ее еще не существует.
Самое главное, чтобы не иметь так много данных и как можно лучше, в то же время, предоставляя по крайней мере информацию в час. Я хочу попробовать построить что-нибудь масштабируемое.
Любая помощь будет оценена по достоинству!