首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >SQL数据库设计问题:多对一关系与完全分离

SQL数据库设计问题:多对一关系与完全分离
EN

Stack Overflow用户
提问于 2018-12-09 13:20:41
回答 1查看 49关注 0票数 0

我正在设计一个简单的数据库来容纳两种类型的数据:

  • 任务(工作单位):与用户的多对一关系
  • 任务后汇总统计(已完成工作的汇总数据):与用户的一对一关系。

数据流当前的工作方式:在第一个表中创建许多任务,当它们完成时,计算一些post任务统计数据,然后将其附加到第二个表的单个Post聚合统计数据行中,并与同一个用户一起使用。然后删除原来的任务。

为了清晰起见,下面是一个数据值的示例:

任务:

代码语言:javascript
代码运行次数:0
运行
复制
{
  id: {uuid}
  user: {user_id}
  create_time: {timestamp}
  last_modified_time: {timestamp}
  description: {string}
  completion_time: {int}
  length: {int}
  difficulty: {int}
  cost: {int}
  ...
}

任务后汇总统计

代码语言:javascript
代码运行次数:0
运行
复制
{
  id: {uuid}
  user: {user_id}
  total_completed_tasks: {int}
  avg_completion_time: {double}
  avg_task_length: {double}
  avg_task_difficulty: {double}
  avg_task_cost: {double}
  ...
}

是否有更好/更明智的方法来设计这种类型的数据的状态。我考虑过的事情:

  • 完成后不删除任务(只需将其标记为完成)并建立多个(任务)到一个(汇总统计)的关系
  • 不聚合统计信息,在任务和单个后任务统计之间创建一对一的关系,然后查询统计表并根据需要进行聚合。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-09 15:34:55

如果您没有太多的卷(这在性能上可能是一个问题),我建议您不要将聚合的统计信息具体化到一个表中,而是在task表的基础上创建一个聚合视图。这样,在查询视图时动态地计算聚合,而不需要处理额外的聚合过程。

PostgreSQL中的示例:

代码语言:javascript
代码运行次数:0
运行
复制
create or replace view task_statistics as
select user
, count(distinct id) as total_completed_tasks
, avg(completion_time) as avg_completion_time
, avg(length) as avg_task_length
, avg(difficulty) as avg_difficulty
, avg(cost) as avg_cost
from task
group by user;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53692715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档