我正在为其他人编写的在线购物车添加“促销代码”功能。这是一个相当棘手的鼠标架构问题,但我想听听一些意见。我的所有三个想法都可行,但您认为哪个最适合可维护性?
所以,这是促销代码的基本表结构:
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
}
请在此处指出任何其他方法或怪异。
答案 0 :(得分:0)
在我的应用程序中,我将其创建为2个表。第一个表就像你一样,但只保留usage_limit
为整数。在第二个表中,我将保留用法,每行一次。
在promocode_usage
表中,我将promocode_id
作为外键,以及其他必需的列,例如使用日期时间,用户ID等。要检查促销是否仍然可用,我将简单地count
promocode_usage
表中promocode_id
我要检查的行usage_limit
。如果结果小于{{1}}值,则可以使用促销。