我目前正在开发基于Django的服务,该服务将从Shopify商店收集用户数据并提供一些见解。我使用PostgreSQL作为我的数据库服务器。我面临的问题是,为每个特定用户创建一个单独的表并将数据存储在那里或者将所有内容保存在一个大表中是否更有效。近似数据长度 - 每个用户大约100k-1mln行。用户之间的数据无关。此外,我需要存储我的分析的用户特定结果。有什么想法吗?
@Gleb:你评论我的另一个答案:
但是我们可以考虑一个更具体的例子:我有一个用户表,它存储所有与用户相关的数据,从每个用户收集额外的数据进行分析(交易)。所以我想为每个用户创建一个新表并存储交易数据,表的名称将存储在table1(我保留有关我的用户的信息)中,以便在需要时找到它。我应该将所有用户的交易保存在一个表中吗?
所以这里有一个更具体的例子。
首先,您有User
模型(甚至可能是djangos默认表),您可以在其中存储名称和电子邮件等属性。
from django.contrib.auth.models import User
其次,你有交易(我编了几个基本字段):
class Transaction(models.Model):
# default AutoField as pk
datetime = models.DateTimeField()
user_from = models.ForeignKey(User, related_name='transactions_from')
user_to = models.ForeignKey(User, related_name='transactions_to')
amount = models.IntegerField()
第三,您可以每月汇总一次交易,以总结每个用户的收款和发送金额:
class Summary(models.Model):
# default AutoField as pk
user = models.ForeignKey(User)
year = models.IntegerField()
month = models.IntegerField()
amount_sent = models.IntegerField()
amount_received = models.IntegerField()
现在,Transaction
模型将有很多记录(你说它可能有每个用户数百万),但Summary
模型每个用户每月只有一条记录,这是非常易于管理的。不过,我不建议为每个用户使用单独的事务模型/表。
如果您不希望每次进行新事务时都希望更新Summary
模型实例,则每月一次可以运行计算每个用户(或您希望运行的任何其他数据分析)的摘要的过程。
之后,您可以自由存档旧的Transactions
(可能是3个月或一年以上的所有内容)。每月一次,您可以运行一个过程将一组给定的Transaction
实例导出到一个文件(CSV,JSON或SQL转储),并从Transaction
模型中删除它们,以防止表的大小扩展到很多。如果您再次需要Transaction
数据,则可以每月获取备份文件以便于查找:
backup_transaction_2018_01.sql
backup_transaction_2018_02.sql
backup_transaction_2018_03.sql
我希望这会给你一些思考的想法。
我建议你有一个大表(Table1
)用于所有用户的数据(一列表明它属于哪个用户)。例如,要存储用户在您的某个网站上访问过的所有网页,您可以使用以下内容:
Table1
pk # maybe automatic id
user_id
datetime
page_url
query_string
some_session_data
如果Table1
变得太大(就像你表明它可能会发生),你可以创建带有日期范围的定期备份(可能是一个备份文件,其中包含来自一个月Table1
行的数据),然后从Table1
中删除旧数据。
backup_table1_2018_01.sql
backup_table1_2018_02.sql
backup_table1_2018_03.sql
此外,您可以使用第二个表(Table2
)来存储分析来自Table1
的数据的结果。 Table2
还会有一个列,指示它属于哪个用户,甚至可能是另一个列,指示它属于哪个日期范围。
继续该示例,您可以创建一个排名,以查看一个月内每个用户访问量最大的页面:
Table2
pk # maybe automatic id
user_id
year
month
page_url
number_of_visits
在计算Table2
的结果后,您可以从Table1
中删除行以节省一些空间。
这可能是一个愚蠢/简单的例子,但我认为它可能是大量数据的有效方法。我希望它能给你一些思考的指示。