Нужно накопительное поле в таблице

База данных: Sybase ASE 15.0.3

Таблицы:

authors(int author_id, varchar(20) author_name)
books(int author_id,int number_of_pages)

Мне нужно добавить новое поле в таблицу "авторы" для total_number_of_pages (сумма количества страниц для всех книг, написанных автором).

Можно ли это сделать с помощью (возможно, материализованного) вычисляемого поля?

Мне не нравится идея представления, я действительно предпочел бы, чтобы поле было в таблице авторов, если это возможно.


person carlo.borreo    schedule 18.01.2012    source источник
comment
почему ты хочешь сделать это? Сколько книг на вашем столе?   -  person    schedule 18.01.2012
comment
Что вы хотите делать, когда новое издание книги заносится в БД?   -  person wildplasser    schedule 18.01.2012
comment
@wildplasser: когда строки в книгах вставляются, удаляются, обновляются, я хочу, чтобы общая сумма обновлялась   -  person carlo.borreo    schedule 18.01.2012
comment
@Mark Bannister: Книг обычно 5-20 на автора.   -  person carlo.borreo    schedule 18.01.2012
comment
@carlo.borreo: я не спрашивал, сколько книг обычно приходится на одного автора, я спрашивал, сколько книг в вашей таблице - всего. Причина, по которой я спрашиваю, заключается в том, что желаемое total_number_of_pages представляет собой форму денормализации - обычно такого рода вещи делаются только для очень больших таблиц, где общее количество часто используется; описанный сценарий не подходит.   -  person    schedule 18.01.2012
comment
@Mark Bannister: я согласен, это денормализовано и уродливо. Я жертвую этим ради скорости. Или, по крайней мере, я хочу увидеть, стоит ли выигрыш жертв. Авторов 200 000 (но только у 40 000 есть книги), книг 150 000. Да, тотал часто используется.   -  person carlo.borreo    schedule 18.01.2012


Ответы (1)


С правильным индексом (на author_id) решение View должно быть довольно быстрым. Это просто агрегация. Если у вас нет сотен или тысяч книг на одного автора, это вообще не должно быть проблемой. (Я ожидаю, что среднее количество книг на одного автора будет меньше или около 10?)


Если вам действительно нужно оптимизировать это и сохранить кешированное значение, я бы порекомендовал триггер.

Когда книги добавляются, удаляются или обновляются в таблице books, вы соответствующим образом изменяете значение в таблице авторов. Это означает наименьшее количество возможных пересчетов.

Обратной стороной этого является повышенная сложность и взаимозависимость вашего дизайна.

person MatBailie    schedule 18.01.2012
comment
Да, я действительно хочу поле в авторах. По крайней мере, это должно выглядеть так, когда кто-то запрашивает его. Триггер кажется лучшим решением, но было бы еще лучше, если бы я мог получить этот результат, не касаясь (с помощью триггера) определения книг. - person carlo.borreo; 18.01.2012