我有两个表来管理做各种事情所花费的时间:
@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
但是如果我这样做,当我将 @times 表与 @task 和 @products 表加入时会变慢,因为应在 2 个(task_id 或 product_id)之间进行选择。当task_id不为空时,加入@tasks,反之亦然。
(我使用的是MySQL6)
非常感谢
最佳答案
我会从时间表中删除 time_in_months 列。如果这些信息只是细节的总和,那么它就是多余的,并且是不成熟的优化。
我将添加一个包含product_id、times_id的product_time表和一个包含task_id、time_id的task_time表
然后获取产品的总时间:
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_ 分钟 - 请注意,此时时间表只是一个无数据的 header 表,其唯一目的是对时间进行分组times_intervals ,它是必需的,因为您的任务安排非常相似。
如果没有两个(或更多)实体使用 times_intervals,您可以简单地将 Product_id 放入 times_intervals 中并将其视为您的 header /主 ID。
关于mysql - 在这种情况下,数据库有更好的内连接以提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6777338/