2010-02-02 3 views
0

J'ajoute la fonctionnalité "code promo" à un panier en ligne écrit par quelqu'un d'autre. C'est une question d'architecture de souris assez micky, mais j'aimerais entendre quelques opinions. Mes trois idées fonctionneraient, mais selon vous, quelle est la meilleure pour la maintenabilité?Quelle architecture de fonction est la meilleure pour la maintenabilité dans ce cas simple?

Alors, voici la structure de la table de base pour les codes promo

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' 
) 

Quel est le plus intelligent (sans se faire trop compliqué):

Vérifier l'existence avec SQL, tout le reste séparement dans le code

// 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 
} 

Ou, avoir une fonction de validation mais l'avoir appelé seulement par t il se fonction:

// 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 
} 

Vérifiez tout dans SQL avec invalide le même que nonexistance:

// 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 
} 

Ne hésitez pas à signaler toute autre approche ou Wackness ici.

Répondre

0

Dans mon application, je le crée comme table 2. Première table comme vous, mais ne maintenez que le usage_limit comme entier. Dans la deuxième table, je vais maintenir l'utilisation, une utilisation par rangée.

Dans le tableau promocode_usage, j'aurai promocode_id comme clé étrangère, et d'autres colonnes nécessaires tels que datetime d'utilisation, ID utilisateur, etc. Pour vérifier si la promo est toujours disponible, je vais simplement count la ligne dans promocode_usage table J'ai promocode_id Je veux vérifier. Si le résultat est inférieur à usage_limit, la promotion peut être utilisée.

Questions connexes