Простой способ наблюдать за активностью пользователя - как улучшить структуру моей базы данных - PullRequest
0 голосов
/ 29 апреля 2010

Добро пожаловать,

Мне нужно несколько советов, чтобы улучшить работу моего веб-приложения.

В начале у меня была такая структура базы данных:

USER

-id (первичный ключ)

-name

-password

-почта ....

ПРОФИЛЬ

- первичный ключ пользователя, внешний ключ (USER)

-birthday

-области

-фотофайл ...

СТР

-id (первичный ключ)

- Пользовательский внешний ключ (USER)

-page

-date

КОММЕНТАРИИ

-id (первичный ключ)

- Внешний ключ пользователя (USER)

-страница внешнего ключа (PAGE)

-comment

-date

* * FAVOURITES_PAGES тысяча сорок-девять

-id (первичный ключ)

- Внешний ключ пользователя (USER)

-favourite_page Внешний ключ (PAGE)

-date

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

Для лучшей производительности (я думаю) я изменил свою структуру на это:

table USER and PROFILE without changes

ACTIVITY (additional table- have common fields: user,date) 
-id (Primary Key)
-user Foreign Key(USER)
-date
-page Foreign Key(PAGE)
-comment Foreign Key(COMMENTS)
-favourite_page Foreign Key(FAVOURITES_PAGES)


PAGES
-id (Primary Key)
-page

COMMENTS
-id (Primary Key)
-page Foreign Key(PAGE)
-comment

FAVOURITES_PAGES
-id (Primary Key)
-favourite_page Foreign Key(PAGE)

Так что теперь очень легко получить отсортированные записи из всех таблиц. Но у меня нет только внешнего ключа для PAGES, COMMENTS и FAVOURITES_PAGES в таблице ACTIVITY - есть около десяти полей внешнего ключа, и в одной записи только одно имеет значение, другие имеют None:

ACTIVITY
id    user     date page comment ...
1    2 2010-02-23 None     1
2    1 2010-02-21 1         None
....

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

Сайт построен на Python / Django.

Любые советы / мнения?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2010

Сайт построен на Python / Django.

При поиске и устранении неисправностей используйте подход «разделяй и властвуй». Вы говорите о структуре вашей базы данных, но упоминаете python / django. Это говорит мне о том, что вы действительно не уверены, что это проблема с базой данных, проблема с приложением или проблема с веб-сервером.

Я думаю, мы оба предполагаем, что это база данных. Так что запустите тест, чтобы увидеть, если производительность базы данных низкая, когда Python / Django не является фактором.

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

0 голосов
/ 29 апреля 2010

Что вы используете для своей базы данных? Если вы используете Oracle, вы можете отслеживать производительность запросов с помощью Grid, чтобы выяснить, почему они работают медленно. Я полагаю, что другие базы данных имеют аналогичные возможности профилирования запросов и инструменты, если вы ищете их.

Также - какова ваша схема индексации? Индексируются ли поля, которые вы используете в качестве внешних ключей, или ваша база данных выполняет полное сканирование таблицы каждый раз, когда вы выполняете объединение?

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