SQL 数据库设计问题:多对一关系与完全分离
SQL Database Design Question: Many To One Relationship vs Full Separation
我正在设计一个简单的数据库来存储两种类型的数据:
- 任务(一个工作单元):与用户的多对一关系
- Post-Task Aggregate Statistic(已完成工作的汇总数据):与用户的一对一关系。
当前数据流的工作方式:许多任务是在第一个 table 中创建的,当它们完成时,会计算一些 post 任务统计数据,然后附加(使用一些公式汇总)到同一用户的第二个 table 的单个 Post-Task Aggregate Statistic 行。然后删除原始任务。
为清楚起见,这里有一个包含数据值的示例:
任务:
{
id: {uuid}
user: {user_id}
create_time: {timestamp}
last_modified_time: {timestamp}
description: {string}
completion_time: {int}
length: {int}
difficulty: {int}
cost: {int}
...
}
Post-任务聚合统计
{
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}
...
}
是否有 better/smarter 方法来设计此类数据的状态。我考虑过的事情:
- 完成后不删除任务(只是将其标记为完成)并建立多(任务)对一(聚合统计)关系
- 不聚合统计数据并在任务和个人之间创建一对一关系 post 任务统计数据然后查询统计数据 table 并根据需要进行聚合
如果您没有太多的容量,这可能会成为性能方面的问题,我建议您不要将聚合统计信息具体化为 table,而是在您的 task
table。这样,当您查询视图时,您的聚合会动态计算,您无需处理额外的聚合过程。
PostgreSQL 中的示例:
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;
我正在设计一个简单的数据库来存储两种类型的数据:
- 任务(一个工作单元):与用户的多对一关系
- Post-Task Aggregate Statistic(已完成工作的汇总数据):与用户的一对一关系。
当前数据流的工作方式:许多任务是在第一个 table 中创建的,当它们完成时,会计算一些 post 任务统计数据,然后附加(使用一些公式汇总)到同一用户的第二个 table 的单个 Post-Task Aggregate Statistic 行。然后删除原始任务。
为清楚起见,这里有一个包含数据值的示例:
任务:
{
id: {uuid}
user: {user_id}
create_time: {timestamp}
last_modified_time: {timestamp}
description: {string}
completion_time: {int}
length: {int}
difficulty: {int}
cost: {int}
...
}
Post-任务聚合统计
{
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}
...
}
是否有 better/smarter 方法来设计此类数据的状态。我考虑过的事情:
- 完成后不删除任务(只是将其标记为完成)并建立多(任务)对一(聚合统计)关系
- 不聚合统计数据并在任务和个人之间创建一对一关系 post 任务统计数据然后查询统计数据 table 并根据需要进行聚合
如果您没有太多的容量,这可能会成为性能方面的问题,我建议您不要将聚合统计信息具体化为 table,而是在您的 task
table。这样,当您查询视图时,您的聚合会动态计算,您无需处理额外的聚合过程。
PostgreSQL 中的示例:
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;