База данных лучше внутреннего объединения для производительности в этом случае - PullRequest
0 голосов
/ 21 июля 2011

У меня есть 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)

Какова наилучшая практика для повторного использования одинаковых @ times и @ times_intervals для @ task и @ products ?

Я бы подумал о:

@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 не равно null, включите @ tasks и наоборот.

(я использую MySQL6)

Большое спасибо

Ответы [ 2 ]

1 голос
/ 21 июля 2011

Я бы удалил столбец time_in_minutes из таблицы времен.Эта информация является избыточной, если она является просто суммой деталей и является преждевременной оптимизацией.

Я бы добавил таблицу product_time, содержащую product_id, times_id, и таблицу task_time, содержащую task_id, 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 - это просто данные- без заголовка таблицы на данный момент и единственная цель - сгруппировать times_intervals, и это необходимо только потому, что у вас очень похожее расположение для задач.

Если не было двух (или более) объектов, использующих times_intervals,Вы можете просто поместить product_id в times_intervals и рассматривать его как свой заголовок / главный идентификатор.

1 голос
/ 21 июля 2011

Я бы рекомендовал не добавлять столбец id в times для каждой таблицы, к которой вы можете присоединиться.Это нарушит нормализацию и сделает объединения гораздо более сложными.

Если у вас есть только один раз (или интервал времени) для задачи или продукта, создайте в этой таблице столбец, который ссылается на таблицу times.В противном случае вы можете создать отдельную таблицу, такую ​​как

@multitimes(multi_id, time_id)

, где два столбца вместе являются первичным ключом, а затем иметь products и tasks ссылку multi_id.Тогда каждая запись в каждой из этих таблиц может быть связана с любым количеством раз без каких-либо конфликтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...