我目前正在开发基于Django的服务,该服务将收集用户'来自Shopify商店的数据并提供一些见解。我使用PostgreSQL作为我的数据库服务器。我面临的问题是,为每个特定用户创建一个单独的表并将数据存储在那里或者将所有内容保存在一个大表中是否更有效。近似数据长度 - 每个用户大约100k-1mln行。用户之间的数据无关。此外,我需要存储我的分析的用户特定结果。有什么想法吗?
答案 0 :(得分:0)
我建议您为所有用户的数据设置一个大表(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
中删除行以节省一些空间。
这可能是一个愚蠢/简单的例子,但我认为它可能是大量数据的有效方法。我希望它能为你提供一些思考的方法。
答案 1 :(得分:0)
@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
我希望这会给你一些想法。