我有两个表来管理用于做各种事情的时间:
@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)为了重用相同的@times_intervals @和@任务和@products,最佳实践是什么?
我会想:
@times(+task_id, +product_id)
// add task_id and product_id to the original @times table但是,如果我这样做了,当我加入@times表时,@task和@products表会慢一些,就像在2 (task_id还是)之间进行选择一样。当task_id不是空时,在@上加入,反之亦然。
(我正在使用MySQL6)
非常感谢
发布于 2011-07-21 14:18:03
我将从times表中删除time_in_minutes列。如果该信息只是细节之和,并且是一个过早的优化,则该信息是多余的。
我将添加一个product_time表,其中包含product_id、times_id和包含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_minutes列的非聚集覆盖索引--请注意,时值表只是一个没有数据的标头表,而且它唯一的目的是对times_intervals进行分组,这是必要的,因为您对任务的安排非常相似。
如果没有两个(或更多)实体使用times_intervals,您可以简单地将product_id放在times_intervals中,并将其作为您的头/主id。
发布于 2011-07-21 14:17:12
我建议不要为可能加入的每个表在times中添加一个times列。这将打破正常化,使连接变得更加复杂。
如果任务或产品只有一次(或时间间隔),则在该表中创建引用times表的列。否则,您可以创建一个单独的表,例如
@multitimes(multi_id, time_id)其中这两列一起是一个主键,然后具有products和tasks引用multi_id。然后,每个表中的每个记录都可以关联到任意次数,而不会发生任何冲突。
https://stackoverflow.com/questions/6777338
复制相似问题