Рекомендации по разработке таблицы истории / аудита - PullRequest
1 голос
/ 09 декабря 2010

Мне нужно следить за многими элементами и их состояниями во времени.

Пример

ItemId Location  DateTime           State
   1   Mall A    2010-02-03 07:00   on_sale
   1   Mall A    2010-02-20 08:22   sold
   2   Warehouse 2010-02-02 09:00   on_sale
   2   Transit   2010-03-02 16:20   transit
   2   Mall B    2010-03-03 10:10   on_sale
   2   Mall B    2010-03-12 12:11   sold

Сейчас это огромная таблица, и я использую функцию псевдо-ранга MySQL для выполнениязапросы.

Однако, это очень медленно.Запросы не могут использовать индексы, поскольку для любого конкретного элемента ему нужно будет найти элемент с рангом = 1, прежде чем он сможет выполнить какую-либо фильтрацию.

SELECT 
    item_sorted.*, IF(@prev <> item_sorted.item_id, @rownum := 1, @rownum := @rownum+1) AS rank,
    @prev := item_sorted.item_id
FROM ...

Каков ваш опыт реализации такой функции??Какой дизайн базы данных вы бы порекомендовали?Будет ли база данных, такая как БД с поддержкой Oracle или T-SQL, намного лучше из-за их поддержки многораздельных запросов?

Заранее спасибо за любые идеи!

1 Ответ

0 голосов
/ 09 декабря 2010

Позвольте мне начать с вопроса:

Какова основная цель этой таблицы? Вставить в него данные или извлечь из него данные?

Две возможности:

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

Если вы хотите сравнить затраты времени, попробуйте установить PostgreSQL и посмотреть результат. Вам не нужно использовать Oracle или MS-SQL, PostgreSQL должен быть достаточно хорош.

Я знаю, что моя рекомендация не имеет ничего общего с разделением данных, но при работе с подобной таблицей я так и делаю, и она отлично работает.

Надеюсь, я смогу помочь,

...