Настройка схемы таблицы в Postgres с подстановочными знаками - PullRequest
0 голосов
/ 11 апреля 2020

Я строил это аналитическое веб-приложение с использованием 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, поскольку для каждого часа будет создаваться новая строка, но только если ее еще не существует.

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

Любая помощь будет оценена по достоинству!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...