【发布时间】:2011-01-11 23:49:32
【问题描述】:
我正在向其他人编写的在线购物车添加“促销代码”功能。这是一个非常棘手的鼠标架构问题,但我想听听一些意见。我的三个想法都行得通,但您认为哪个最有利于可维护性?
所以,这是促销代码的基本表结构:
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
}
请随时在此处指出任何其他方法或古怪之处。
【问题讨论】:
标签: php sql architecture refactoring