在这种简单的情况下,哪种功能架构最适合可维护性?

时间:2010-02-02 01:59:12

标签: php sql architecture refactoring

我正在为其他人编写的在线购物车添加“促销代码”功能。这是一个相当棘手的鼠标架构问题,但我想听听一些意见。我的所有三个想法都可行,但您认为哪个最适合可维护性?

所以,这是促销代码的基本表结构:

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 :(得分:0)

在我的应用程序中,我将其创建为2个表。第一个表就像你一样,但只保留usage_limit为整数。在第二个表中,我将保留用法,每行一次。

promocode_usage表中,我将promocode_id作为外键,以及其他必需的列,例如使用日期时间,用户ID等。要检查促销是否仍然可用,我将简单地count promocode_usage表中promocode_id我要检查的行usage_limit。如果结果小于{{1}}值,则可以使用促销。