Использование наследования для решения проблемы проектирования - PullRequest
2 голосов
/ 12 мая 2011

Мне нужна таблица, в которой хранятся предметы и треки, когда предмет ...

  1. поставлен в очередь
  2. помечен для доставки
  3. отправлен
  4. помечено для возврата
  5. возвращено

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

  1. за месяц
  2. имеет дома в это время

Я пытался использовать наследование.Я назначил каждому шагу typeId (от 1 до 5, каждый идентификатор представляет текущий шаг в рабочем процессе).Этот подход не идеален, потому что обновление шага рабочего процесса стирает историю.

Например, если элемент перемещается с shipped (typeId 3) на returned (typeId 5), мы теряем точное количество отправленных элементов..

Как мне подойти к этому?Кроме того, я предпочитаю хранить данные в одной таблице, если у меня нет веских причин не делать этого.

Обновление

Элементы отправляются клиентам по почте постепенно.Существуют ограничения на количество товаров, которые клиент может получить в течение месяца, и ограничения на количество товаров, которые клиент может иметь дома в любой момент времени.Для этого примера предположим, что 4 для более ранних и 2 для последних.В очереди клиентов может быть любое количество элементов.По этой причине элементы в очереди должны быть ранжированы таким образом, чтобы порядок отправляемых элементов мог быть в соответствии с предпочтениями клиентов.

Товары, которые уже были отправлены, должны выпадать из рейтинга (клиент больше не можетизменить ранг после отправки предмета).

Ответы [ 2 ]

3 голосов
/ 12 мая 2011

Здесь нет наследства.Поля времени на самом деле являются датой и временем.Строка вводится в таблицу Tracking, когда клиент добавляет элемент в очередь.Другие столбцы времени от TimeMarkedShip до TimeReturned равны NULL, пока действие не произойдет.TimeQueued является частью первичного ключа, чтобы позволить клиенту арендовать предмет более одного раза (для меня это похоже на видеопрокаты).

enter image description here

Для подсчета предметовчто у клиента дома вы можете использовать что-то вроде

select count(1)
from Tracking
where CustomerID = 1755
  and TimeShipped  is not NULL
  and TimeReturned is NULL ; 
1 голос
/ 12 мая 2011

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

Кроме того, если вы хотите отслеживать историю, вы можете сделать каждый из этих шагов пустым полем даты, чтобы вы могли видеть, что предмет был отправлен 3/5/11 и возвращен 4 /1/11.Это может помочь, если вы используете эту таблицу другими способами, такими как управление доставкой / получением или выставлением счетов.NULL, конечно, будет указывать, что шаг не был выполнен (пока).

...