Правильна методика зберігання даних про події користувачів


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

Або це рівень ярусів таблиць, або розбиття на різні таблиці на основі дат, або на кількість користувачів, або щось інше?

Можливо, ви захочете вивчити поняття «розділення» у вашій базі даних. Більшість RDBMS мають певну підтримку для них (наприклад, mysql , oracle , sql-сервер , postgresql ). В основному, ви дозволяєте RDBMS обробляти процес створення / управління тим, що кожен місяць / рік / все, що зберігається в окремій таблиці, тоді як код, що звертається до нього, розглядає його як одну велику таблицю.

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


Дякую @Joe, я прочитав це у Вікіпедії ( en.wikipedia.org/wiki/Partition_%28database%29 ) та деякі з посилань, які ти опублікував. Тип поділу, на який ви б посилалися, був би горизонтальний розподіл. Це особливість, про яку я не знав, що існувала досі. Зараз я поставлю нове запитання: dba.stackexchange.com/questions/4134/…, яке задає належну практику розділення.
CenterOrbit

6

Ви зробили дуже гарне спостереження. Таблиця активності буде рости швидко і масштабно. Що я робив у минулому - це архів старих даних (скажімо, старших 14 днів) до таблиці ActivityHistory . У такий спосіб зберігається таблиця " Діяльність" до керованого розміру, і якщо вам потрібно зробити дослідження, ви завжди можете озирнутися на таблицю ActivityHistory .


1
Мені подобається ваша ідея, і це рішення, яке буде відповідати практично будь-якій установці бази даних, навіть ті, що не підтримують рішення @Joe. Однак це також ускладнить деякі запити, якщо вам потрібно отримати доступ до старих архівованих даних і створити необхідність додавання об'єднання для об'єднання. Дуже добре, хоча я не думав про такий підхід. Дякую.
CenterOrbit

Це не обов'язково складно, ви можете грати за допомогою рядків підключення з програми, щоб вибрати db історії у випадку, якщо дані старші. Або ви можете використовувати пов'язані сервери в процедурах, і якщо деякий час дат старший за x днів, перейдіть на пов'язаний з Архів сервер замість основного сервера.
Мар’ян

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