在这种情况下,数据库可以更好地进

时间:2011-07-21 14:04:57

标签: mysql database database-design

我有2个表来管理做各种事情所花费的时间:

@times(id, time_in_minutes)
@times_intervals(id, times_id, time_in_minutes, start, end)

然后 @times 可能涉及不同的事情:

@tasks(id, description)
@products(id, description, serial_number, year)

@task @products <重复使用 @times @times_intervals 的最佳做法是什么? /强>

我会考虑:

@times(+task_id, +product_id) 
// add task_id and product_id to the original @times table

但是,如果我这样做,当我加入 @task 表与 @task @products 时,表格会变慢应该在2之间进行选择( task_id product_id )。当task_id不是null时,加入 @tasks ,反之亦然。

(我正在使用MySQL6)

非常感谢

2 个答案:

答案 0 :(得分:1)

我建议不要为id添加times列,以便为您加入的每个表添加times列。它会破坏规范化并使连接变得更加复杂。

如果您只有一次(或时间间隔)任务或产品,请在该表中创建一个引用@multitimes(multi_id, time_id) 表的列。否则,您可以创建一个单独的表,如

products

其中两列是主键,然后tasksmulti_id引用{{1}}。然后,每个表中的每个记录都可以与任何次数相关,没有任何冲突。

答案 1 :(得分:1)

我会从时间表中删除time_in_minutes列。如果信息只是细节的总和并且是过早的优化,则该信息是多余的。

我会添加一个product_time表,其中包含product_id,times_id和一个包含task_id的task_time表,time_id

然后获得产品的总时间:

SELECT *
FROM product p
INNER JOIN product_time pt
    ON pt.product_id = p.id
INNER JOIN (
    SELECT times_id, SUM(time_in_minutes) as time_in_minutes
    FROM times_intervals
    GROUP BY times_id
) AS t
    ON t.times_id = pt.times_id

通常要执行此操作,您将拥有times_intervals的非聚集覆盖索引,其中包含列times_id和time_in_minutes - 请注意,时间表此时只是一个无数据的表头,并且它的唯一目的是将其分组times_intervals,它只是必要的,因为你对任务有这种非常相似的安排。

如果没有两个(或更多)实体使用times_intervals,您可以简单地将product_id放在times_intervals中,并将其视为标题/主ID。