Какая функциональная архитектура является лучшей для удобства обслуживания в этом простом случае? - PullRequest
0 голосов
/ 02 февраля 2010

Я добавляю функцию "промо-код" в онлайн-корзину, написанную кем-то другим. Это довольно сложный вопрос архитектуры мыши, но мне хотелось бы услышать пару мнений. Все три мои идеи сработают, но что, по вашему мнению, лучше всего подходит для ремонтопригодности?

Итак, вот основная структура таблицы для промо-кодов:

CREATE TABLE `promocodes` (
    `promocode_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `promocode` VARCHAR( 255 ) NOT NULL ,
    `description` VARCHAR( 255 ) NULL ,
    `discount_percentage` INT NULL ,
    `discount_dollars` DECIMAL( 6, 2 ) NULL ,
    `expiration_date` DATE NULL ,
    `uses_remaining` INT NULL ,
    `is_active` BOOL NOT NULL DEFAULT '1'
)

Что самое умное (без чрезмерного усложнения):

Проверка существования с помощью SQL, все остальное отдельно в коде

// LIBRARY
function promoCodeExists($promoCodeString){
  // make sql call
  return $promoCodeDetailsHash; // or false if no record
}

function isPromoCodeUsable($promoCodeDetailsHash){
  // check expiry date and number of uses left and active / inactive
}

function usePromoCode($promoCodeId){
  // do order association
  // decrement uses left
}

// USAGE 
$promoCodeDetailsHash = promoCodeExists($promoCode);
if (is_array($promoCodeDetailsHash) AND isPromoCodeUsable($promoCodeDetailsHash)){
  usePromoCode($promoCodeDetailsHash['id'])
} else {
  // invalid promo code
}

Или иметь функцию проверки, но вызывать ее можно только с помощью функции get:

// LIBRARY
function validatePromoCode($promoCodeDetailsHash){
  // check expiry date and number of uses left and active / inactive
}

function isPromoCodeUsable($promoCodeString){
  // make sql call
  return validatePromoCode($promoCodeDetailsHash); // or false if no record
}

// USAGE 
$promoCodeDetailsHash = promoCodeExists($promoCode);
if (is_array(isPromoCodeUsable($promoCodeDetailsHash))){
  usePromoCode($promoCodeDetailsHash['id'])
} else {
  // invalid promo code
}

Проверить все в SQL с недействительными так же, как и с отсутствием:

// LIBRARY
function getDetailsForUsablePromoCode($promoCode){
  // use SQL WHERE clauses to only return existence for currently valid promo codes
  // or false if no result
}

// USAGE
$promoCodeDetailsHash = getDetailsForUsablePromoCode($promoCode)
if (is_array($promoCodeDetailsHash)){
  usePromoCode($promoCodeDetailsHash['id'])
} else {
  // error state
}

Не стесняйтесь указывать на любые другие подходы или недомогания здесь.

1 Ответ

0 голосов
/ 02 февраля 2010

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

В таблице promocode_usage у меня будет promocode_id в качестве внешнего ключа и другие обязательные столбцы, такие как дата использования, идентификатор пользователя и т. Д. Чтобы проверить, доступна ли акция, я просто count строка в promocode_usage таблице, в которой есть promocode_id, которую я хочу проверить. Если результат меньше usage_limit значение, промо может быть использовано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...