Есть ли лучший способ получить старые данные? - PullRequest
1 голос
/ 16 июля 2009

Скажем, у вас есть такая база данных:

books
-----
id
name

И вы хотели получить общее количество книг в базе данных, простейший из возможных sql:

"select count(id) from books"

Но теперь вы хотите получить общее количество книг в прошлом месяце ...

Редактировать: но некоторые книги были удалено из таблицы с прошлого месяца

Ну, очевидно, вы не можете подвести итоги за месяц, который уже прошел - таблица "books" всегда актуальна , а некоторые записи уже удалены

Мой подход состоял в том, чтобы запустить задание cron (или запланированное задание) в конце месяца и сохранить итоги в другой таблице, называемой report_data, но это кажется неуклюжим Есть идеи получше?

Ответы [ 8 ]

3 голосов
/ 16 июля 2009

Добавьте столбец по умолчанию со значением GETDATE () , назовите его «DateAdded». Затем вы можете выполнить запрос между любыми двумя датами, чтобы узнать, сколько книг было за этот период, или вы можете просто указать одну дату, чтобы узнать, сколько книг было до определенной даты (за всю историю).

За комментарий: Вы не должны удалять, вы должны мягкое удаление .

1 голос
/ 16 июля 2009

Вы только что сделали маленький шаг по пути к истории баз данных или хранилищ данных.

Хранилище данных обычно хранит данные о том, как все было в таком формате, что более поздние данные будут добавляться к текущим данным вместо замены текущих данных. Существует много узнать о хранилищах данных. Если вы серьезно идете по этому пути, я предлагаю книгу Ральфа Кимбалла или Билла Инмона. Я предпочитаю Кимбалл.

Вот сайты: http://www.ralphkimball.com/

http://www.inmoncif.com/home/

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

1 голос
/ 16 июля 2009

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

1 голос
/ 16 июля 2009

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

1 голос
/ 16 июля 2009

Если вам нужны данные за предыдущий месяц, вам не следует удалять старые данные. Вместо этого вы можете иметь «логическое удаление».

Я бы добавил поле статуса и некоторые даты в таблицу.

books
_____
id
bookname
date_added
date_deleted
status (active/deleted)

Оттуда вы сможете запросить:

SELECT count(id) FROM books WHERE date_added <= '06/30/2009' AND status = 'active'

ПРИМЕЧАНИЕ: это не лучшая схема, но вы поняли ...;)

1 голос
/ 16 июля 2009

Мой подход состоял в том, чтобы запустить задание cron (или запланированное задание) в конце месяца и сохранить итог в другой таблице, называемой report_data, но это кажется неуклюжим.

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

  • Таблица "report_data" очень проста для создания отчетов / графиков из
  • Вам не нужно реализовывать специальный код мягкого удаления для всего, что нужно для удаления книги
  • Вам не нужно добавлять "and active = 1" в конец каждого запроса, который выбирается из таблицы книг

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

1 голос
/ 16 июля 2009

Я согласен с JP, сделайте мягкое удаление / логическое удаление. Для одного дополнительного оператора AND на запрос это делает все намного проще. Кроме того, вы никогда не потеряете данные.

Конечно, если экстремальный размер становится проблемой, тогда да, вам, возможно, придется начать физическое перемещение / удаление строк.

0 голосов
/ 16 июля 2009

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

select count(id) from books where date_added <= '06/30/2009'; 
...