Правильная техника для хранения пользовательских данных о событиях


12

Я в основном самоучка, когда дело доходит до дизайна базы данных. Я задаю этот вопрос, потому что я остановился на этой общей структуре, но мне интересно, является ли это наиболее эффективным или «отраслевым стандартом» методом.

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

+--------------------+                   +------------------------+
|   UserData         |                   |   Activity             |
+-=------------------+                   +------------------------+
| ID     (auto uint) | <--1-to-many-+    | ID  (auto uint)        |
| UserName (text)    |              +--> | UserID (uint)          |
| Email    (text)    |                   | Timestamp (time)       |
| additional info... |                   | Type (ID to elsewhere) |
+--------------------+                   | additional info...     | 
                                         +------------------------+

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

Ответы:


5

Или это уровень таблиц, или разделение на разные таблицы по датам, количеству пользователей или что-то еще?

Возможно, вы захотите изучить концепцию «разбиения» в вашей базе данных. Большинство СУБД имеют некоторую поддержку для них (например, mysql , oracle , sql server , postgresql ). По сути, вы позволяете СУБД обрабатывать процесс создания / управления тем фактом, что каждый месяц / год / все, что хранится в отдельной таблице, в то время как код, обращающийся к ней, обрабатывает ее как одну большую таблицу.

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


Спасибо @Joe, я прочитал об этом в Википедии ( en.wikipedia.org/wiki/Partition_%28database%29 ) и некоторых ссылках, которые вы опубликовали. Тип разбиения, на который вы ссылаетесь, будет горизонтальным. Эта функция, о которой я не знал, существовала до сих пор. Теперь я задам новый вопрос: dba.stackexchange.com/questions/4134/…, который задает правильную практику разбиения.
ЦентрОрбит

6

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


1
Мне нравится ваша идея, и это решение подойдет практически для любой установки базы данных, даже если она не поддерживает решение @Joe. Однако это также усложнит некоторые из задействованных запросов, если вам потребуется доступ к более старым заархивированным данным и создаст необходимость добавления объединения объединения. Очень хорошо, хотя я не думал об этом подходе. Спасибо.
ЦентрОрбит

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

Это еще менее сложно, если таблица ArchiveHistory находится в той же базе данных.
Майкл Райли - AKA Gunny
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.