正确的技术来存储用户事件数据


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...     | 
                                         +------------------------+

我只是想知道我在哪里可以改善任何地方,以帮助我学习。

Answers:


5

是表的层,还是根据日期,用户数量或其他原因拆分为不同的表?

您可能需要研究数据库中“分区”的概念。大多数RDBMS对它们都有一些支持(例如mysqloraclesql serverpostgresql)。基本上,让RDBMS处理创建/管理每个月/年/任何内容存储在单独表中这一事实的过程,而访问它的代码将其视为一个大表。

您可以按用户名,日期或最常使用的访问数据的方式对其进行分区。(将其设置为以用户为中心与以日期为中心有优点/缺点...但我不知道您是否要我介绍所有内容)


感谢@Joe,我确实在Wikipedia(en.wikipedia.org/wiki/Partition_%28database%29)和您发布的一些链接上进行了阅读。您要指的分区类型是水平分区。到目前为止,我不知道该功能。现在,我将提出一个新问题:dba.stackexchange.com/questions/4134/…,它要求适当的分区实践。
CenterOrbit 2011年

6

您已经做了很好的观察。该活动表将快速增长较大。我过去所做的工作是将较旧的数据(例如,超过14天)存档到ActivityHistory表中。这样做可以将Activity表保持在可管理的大小,并且如果您需要进行研究,则可以随时查看ActivityHistory表。


1
我喜欢您的想法,它是一种解决方案,几乎适用于所有数据库设置,甚至不支持@Joe解决方案的数据库。但是,如果您需要访问较早的存档数据并增加添加联合联接的必要性,这也会使所涉及的一些查询复杂化。很好,但是我没有想到这种方法。谢谢。
CenterOrbit 2011年

这并不一定很复杂,如果数据较旧,您可以使用应用程序中的连接字符串来选择历史数据库。或者您可以在过程中使用链接服务器,并且某些日期时间早于x。天,请转到存档链接服务器而不是主服务器。
玛丽安

如果ArchiveHistory表位于同一数据库中,则更为简单。
迈克尔·赖利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.