我有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)
非常感谢
答案 0 :(得分:1)
我建议不要为id
添加times
列,以便为您加入的每个表添加times
列。它会破坏规范化并使连接变得更加复杂。
如果您只有一次(或时间间隔)任务或产品,请在该表中创建一个引用@multitimes(multi_id, time_id)
表的列。否则,您可以创建一个单独的表,如
products
其中两列是主键,然后tasks
和multi_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。