2009-08-20 3 views
8

Мы используем сторонний продукт для управления членством в спортивном центре. У нас есть несколько типов членства (например, младший, ученик, штат, сообщество) и несколько статусов членства (например, годовой, активный, неактивный, приостановленный). К сожалению, продукт регистрирует только текущий тип членства и статус участника. Я хотел бы отслеживать, как изменились тип и статус наших членов с течением времени.Дизайн базы данных для хранения информации человека, которая изменяется со временем?

В настоящее время мы имеем доступ к дизайну базы данных продукта. Он работает на SQL Server, и мы регулярно запускаем собственные SQL-запросы против таблиц продукта для создания собственных таблиц. Затем мы связываем наши таблицы с сводными таблицами в Excel для создания диаграмм. Поэтому мы знакомы с дизайном базы данных и SQL. Однако мы зацикливаемся на том, как наилучшим образом подойти к этой проблеме.

Продукт регистрирует членские взносы членов и их даты начала и окончания. Таким образом, мы можем восстановить данные, чтобы определить тип и статус участника в любой момент времени. Например, если они купили младшее членство на 1 января 2007 года, и оно истекло 31 декабря 2007 года, а затем они купили членство в университете 1 июня 2008 года, мы можем видеть, что их статус перешел от активного к неактивному активному (на Ян 1, 2008 и 1 июня 2008 года, соответственно), и их тип пошел от младшего к ученику (1 июня 2008 года).

По существу, мы хотели бы поменять тип элемента и его статус на temporal properties или effectivities a-la Fowler (или некоторые другие вещи, которые меняются со временем).

Наш вопрос (наконец :) - с учетом вышесказанного: какой дизайн таблицы таблиц базы данных вы бы рекомендовали использовать для хранения этой информации о членах. Я предполагаю, что у него будет столбец для MemberID, чтобы мы могли войти в существующую таблицу Member. Ему также необходимо будет сохранить статус и тип участника и диапазон дат, на который они были проведены. Мы хотели бы иметь возможность легко писать запросы против этой таблицы (таблиц), чтобы определить, сколько членов каждого типа и статуса у нас было в данный момент времени.

UPDATE 2009-08-25: Были сторонние пути и не имели возможности опробовать предлагаемые решения. Надеюсь сделать это в ближайшее время и выберем ответ на основе результатов.

+0

Связанный вопрос о модели данных временных рядов: http://stackoverflow.com/questions/4083464/design-database-relating-to-time-attribute/ – Vadzim

ответ

7

Учитывая, что ваша система уже написана и на месте, самый простой подход к этой проблеме (и тот, который влияет на существующую базу данных/код наименее) заключается в том, чтобы добавить таблицу истории членства, которая содержит MemberID, статус, тип и столбцы даты. Затем добавьте триггер UPDATE и INSERT в таблицу основных участников. Когда эти триггеры запускаются, вы записываете новые значения для члена (вместе с датой изменения статуса) в таблицу истории участников. Затем вы можете просто запросить эту таблицу, чтобы получить истории для каждого члена.

Это довольно просто реализовать и не повлияет на существующую систему вообще.

Я напишу это для вас для бесплатного членства. :)

+0

Grin. Спасибо за ответ. Я был бы рад предложить бесплатное членство, но, похоже, вы находитесь в США, и мы находимся в Австралии, поэтому это может быть не очень полезно для вас. – dave

+1

Мое единственное дополнение к этому ответу состояло бы в том, чтобы таблица истории содержала все поля в таблице Membership - плюс поле timestamp для даты/времени изменения и возможное поле пользователя для записи, кто его изменил. Таким образом, вы записываете все изменения. –

+0

Я думаю о том, чтобы заняться плаванием, так что вы можете увидеть меня раньше, чем вы думаете. – MusiGenesis

0

Я бы поставил информацию о членстве в свой собственный стол с датами начала и окончания. Хранение клиента в отдельной таблице. Это боль, если вам нужна «текущая» информация о членстве все время, но есть много способов обойти это либо через запросы, либо триггеры.

1

Я бы создал базу данных отчетов, которая была организована в схему звездочек. Размерность членства будет располагаться временно, так что будут разные строки для одного и того же элемента в разные моменты времени. Таким образом, разные строки в таблице фактов могут относиться к различным точкам истории.

Затем я создавал процедуры обновления для периодической обновления базы данных отчетов, скажем один раз в неделю, из основной базы данных. Вот тут и придет основная работа.

Затем я буду вести отчеты из базы данных отчетов. Очень просто сделать схему звездочек делать то же самое, что и сводная таблица. Если необходимо, я бы получил какой-то инструмент OLAP, чтобы сидеть перед отчетной базой данных.

Это очень много работы, но со временем это окупится.

2

Я не могу рекомендовать вам достаточно, чтобы прочитать «Sql для смартфонов» Джо Селко - передовое программирование на языке SQL ». он имеет целую главу о разработке временной базы данных и как (эффективно и эффективно) запускать временные запросы на проекцию, выборку и временную вставку. И я не стал бы оправдывать его, чтобы попытаться объяснить, что он говорит в своей главе в этом посте.

+0

Просто прочитайте ваш профиль и заметили, что вы в Сидней, а также помощник :) –

+0

Я в Сиднее. Я попытаюсь выследить предложенную вами ссылку. Как только я получу Пепел. – dave

+0

Оформить брошюры в Северном Сиднее - посвященные компьютерным книгам. Celko - это ссылка в любой базе данных/sql - агностике реализации. Лучшие инвестиции, которые я когда-либо делал в книге. –