Модель данных для просмотров страницы профиля - PullRequest
2 голосов
/ 22 ноября 2010

Скажем, у меня есть сайт с профилями пользователей, которые имеют общедоступные страницы (каждый профиль имеет несколько страниц каждый). Я хотел бы показать статистику просмотра страниц пользователей (например, за страницу, за определенный период времени и т. Д.). Какой хороший способ хранения просмотров страниц?

Вот что я думал:

Table Page Views
================
- Id (PK)
- Profile Id (FK)
- Page Id (FK)
- Timestamp

Боюсь, это решение не масштабируется. Предложения?

Ответы [ 3 ]

1 голос
/ 22 ноября 2010

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

Как уже отмечалось, масштабирование действительно ваша проблема?Если это так и при условии наличия интернет-сайта (в отличие от внутреннего), пропустите свой собственный переход и собирайте данные о посещениях с помощью Google Analytics или чего-то подобного.Затем возьмите эти данные и обработайте их для генерации итогов по профилю.

Однако, если вы действительно хотите сделать это самостоятельно, рассмотрите вместо этого анализ лога.Если вы можете перечислить URL-адреса для каждого профиля, используйте эту информацию и журналы своего веб-сервера для генерации итоговых результатов.Ваши друзья, такие как Microsoft Log Parser , который может обрабатывать МНОГО различных форматов, или инструменты командной строки * nix, такие как sed и grep.

Если перечисление невозможно, измените код для регистрации необходимой информации и обработки этого файла журнала.

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

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

0 голосов
/ 22 ноября 2010

Полагаю, вы можете иметь

tblPerson

personid(pk)
activeProfileID(fk)    -- the active profile to use.
timestamp

tblPage

pageid(pk)
data

tblPersonProfile

profileID(pk)
timestamp

tblProfilePages

profilePageID(pk)
profileid(pk)
pageid(pk)
isActive
0 голосов
/ 22 ноября 2010

Это зависит от того, какие отчеты вы хотите сделать доступными.

Если вы хотите иметь возможность сказать «это список людей, которые просматривали вашу страницу между этими двумя датами», то вы должны хранить все предложенные вами данные.

Если вам нужно только сказать «ваша страница была просмотрена Х раз между этими двумя датами», то вам нужна только таблица с идентификатором страницы, датой и счетчиком. Обновите столбец счетчика на каждом просмотре страницы одним запросом UPDATE.

...