2010-04-07 3 views
1

У меня есть база данных, которая содержит историю продаж продукта. Например, нижеследующая таблицаВопросы проектирования баз данных о дублирующейся информации

CREATE TABLE SalesHistoryTable (
OrderID, // Order Number Unique to all orders 
ProductID, // Product ID can be used as a Key to look up product info in another table 
Price, // Price of the product per unit at the time of the order 
Quantity, // quantity of the product for the order 
Total, // total cost of the order for the product. (Price * Quantity) 
Date, // Date of the order 
StoreID, // The store that created the Order 
PRIMARY KEY(OrderID)); 

В итоге в итоге будет заключено миллион сделок. Из этого можно создавать профили для продуктов в разных географических регионах (на основе StoreID). Создание этих профилей может занять много времени в качестве запроса к базе данных. Например.

SELECT ProductID, StoreID, 
SUM(Total) AS Total, 
SUM(Quantity) QTY, 
SUM(Total)/SUM(Quantity) AS AvgPrice 
FROM SalesHistoryTable 
GROUP BY ProductID, StoreID; 

Вышеприведенный запрос может быть использован для получения информации на основе продуктов для любого конкретного магазина. Тогда вы могли бы определить, какой магазин продал больше всего, сделал больше денег и в среднем продает в основном/наименее. Это было бы очень дорого использовать в качестве обычного запроса в любое время. Каковы некоторые дизайнерские решения, позволяющие запускать эти типы запросов быстрее при условии, что размер хранилища не является проблемой. Например, я мог бы создать другую таблицу с дублирующейся информацией. Идентификатор магазина (ключ), идентификатор продукта, TotalCost, QTY, AvgPrice И предоставить триггер, чтобы при получении нового заказа запись для этого магазина обновляется в новой таблице. Стоимость обновления почти ничего.

Что следует учитывать при использовании приведенного выше сценария?

+1

Ваш собственный ответ является спонтанным для такого рода запросов. Кэширование результатов в базе данных обеспечит гораздо большее ускорение, чем все, что вы можете сделать. Другая приятная вещь в этом подходе заключается в том, что, если по какой-то причине ситуация когда-либо вышла из-за синхронизации, вы можете выбросить все и заново создать таблицу с одним запросом. – roufamatic

ответ

2

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

У вас также может быть вторая таблица, заполняемая пакетным заданием на периодической основе (дополнительная опция для хранения данных, такая как опция). Вы также можете использовать материализованное представление, если ваша база данных поддерживает их.

+0

+1: Спасибо, я посмотрю материализованные взгляды. – galford13x

1

Я бы рассмотреть:

  • хранилища данных/OLAP решение
  • (как вы сказали) запускать интеллектуальный анализ данных запросов к отдельным предвычисленным таблицам/набор данных
  • индексируются/материализованные представлениями, который почти такой же, как в предыдущем пункте

Есть некоторые вопросы, хотя:

  • Вы ожидаете данные в реальном времени?
  • Какой у вас объем записи?
  • какой двигатель DB?
+0

+1: Данные могут быть в реальном времени с задержкой задержки наследования, конечно. Я предполагаю, что вы выполняете пакетные задания и делаете обновление данных 1/час, или что-то подобное может быть вариантом, как упоминал Эрик. Объем записи будет порядка> 1000/день. Однако у меня есть доступ к данным, которые восходят к 2006 году. Я еще не уверен, так как я не создал и не импортировал данные, но я предполагаю, что имеется более 1,5 миллионов строк информации. – galford13x

1

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

+0

+1: Спасибо, я не слышал о материализованных взглядах. Я обязательно посмотрю на них. – galford13x

0

«Стоимость обновления почти ничего».

За исключением того, что все обновления должны быть сериализованы. Потому что, несмотря ни на что, древний закон физики по-прежнему остается тем, что в одном месте одновременно нет двух вещей.

+0

Я думаю, что вижу, что вы говорите, но я не уверен, как это применимо. Если каждый час продается 1000 продаж, это означает 1000 вложений в SalesHistoryTable и 1000 триггеров, которые вызывают результат в 2 дополнениях и в раздел + обновление строки. Это выглядит намного дешевле, чем запрос 1000 раз? – galford13x

+0

Возможно, мне следует изменить мое заявление на «Стоимость обновления почти ничего не по сравнению с запросом»? Это может быть немного более относительным. – galford13x

Смежные вопросы