首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这种情况下,数据库最好是内部连接以提高性能。

在这种情况下,数据库最好是内部连接以提高性能。
EN

Stack Overflow用户
提问于 2011-07-21 14:04:57
回答 2查看 70关注 0票数 0

我有两个表来管理用于做各种事情的时间:

代码语言:javascript
复制
@times(id, time_in_minutes)
@times_intervals(id, times_id, time_in_minutes, start, end)

那么@times可能与不同的东西有关:

代码语言:javascript
复制
@tasks(id, description)
@products(id, description, serial_number, year)

为了重用相同的@times_intervals @和@任务@products,最佳实践是什么?

我会想:

代码语言:javascript
复制
@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)

非常感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-21 14:18:03

我将从times表中删除time_in_minutes列。如果该信息只是细节之和,并且是一个过早的优化,则该信息是多余的。

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

然后得到一个产品的总时间:

代码语言:javascript
复制
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。

票数 1
EN

Stack Overflow用户

发布于 2011-07-21 14:17:12

我建议不要为可能加入的每个表在times中添加一个times列。这将打破正常化,使连接变得更加复杂。

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

代码语言:javascript
复制
@multitimes(multi_id, time_id)

其中这两列一起是一个主键,然后具有productstasks引用multi_id。然后,每个表中的每个记录都可以关联到任意次数,而不会发生任何冲突。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6777338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档