2009-09-02 6 views
1

Quelqu'un at-il des idées sur un bon moyen de modéliser le scénario suivant dans mon domaine/base de données pour une application .NET? Disons que j'ai certaines réductions qui peuvent être appliquées aux transactions de vente, mais les réductions ne doivent être appliquées que certains jours de la semaine à certains moments. Ainsi, par exemple, si une vente a lieu le lundi entre 9 heures et midi, la réduction doit être appliquée, mais si une vente a lieu le mardi entre ces heures, aucune réduction n'est appliquée. J'aimerais pouvoir gérer plusieurs périodes dans la même journée (ie - mercredi de 9h à midi et de 18h à minuit)Restrictions du jour de la semaine/de l'heure pour une application .NET

+0

Cela ressemble étrangement à des devoirs. – Powerlord

+0

@R.Bemrose: Je ne sais pas pourquoi tu penses ça, mais même si c'est le devoir, ça ne change rien. Il peut toujours demander des conseils sur StackOverflow. –

+0

Je viens de penser que quelqu'un a dû mettre en œuvre quelque chose comme ça dans le passé et j'ai certainement des idées sur la façon dont cela peut être fait. Je voulais juste voir s'il y avait des idées auxquelles je n'avais pas pensé. – jnathanking

Répondre

0

Je l'ai fait quelque chose semblable à ceci

Votre table de SalePrice ressemblerait (tables de démarque damn):

SalePriceId guid, PK
ItemId guid, FK
StartTime Timespan
EndTime Timespan
DaysOfWeek DaysOfWeek (drapeau enum)
Remise à double

(Ceci est à partir de la vue de code; Timespan est une classe .NET qui est mappée dans Sql 2008)

DaysOfWeek est un drapeau enum contenant Sun-Sat.

Donc, pour trouver des ventes pour un élément qui sont en vigueur le mardi, vous feriez quelque chose comme

select * 
from SalePrice 
where ItemId = @itemGuid 
and StartTime <= @time 
and EndTime >= @time 
and DaysOfWeek & @DOW = @DOW 

C'est le modèle de base. Ne vous attendez pas à ce que le travail de copier-coller (je ne suis pas sûr de mes trucs de requête au niveau du bit), mais j'utilise ce modèle avec succès pour suivre les prix actuels.

+0

vous devriez utiliser le type décimal pour Discount ou (money in SQL) – MaLio

1

J'écrirais simplement une méthode "GetDiscount" qui implémenterait la logique que vous êtes. décrivant. vous pouvez utiliser l'objet DateTime pour déterminer le jour et l'heure.

d'après votre description, il ne voit pas pourquoi cette solution simple habitude fonctionne pour vous. Qu'est-ce exactement ce que vous attendez?

+0

Les jours et les périodes doivent être configurés différemment pour chaque remise. Il y aura donc une interface utilisateur qui permet à l'utilisateur final de spécifier les jours et les périodes pour chaque remise individuelle. Donc, j'ai besoin de persister ceux à la base de données avec la réduction à laquelle ils sont liés. – jnathanking

0

Je créerais simplement les deux classes suivantes en supposant que vous appliquiez la réduction à un ordre de type "comlete", pas à des éléments individuels.

class Order 
{ 
    Guid Id; 
    DateTime TimeStamp; 
    Discount Discount; 
} 

class Discount 
{ 
    Guid Id; 
    DayOfWeek Day; 
    TimeSpan StartTime; 
    TimeSpan EndTime; 
    Decimal Amount; 
} 

Ensuite, vous pouvez utiliser Order.TimeStamp.DayOfWeek et Order.TimeStamp.TimeOfDay et recherche une liste de réductions jusqu'à ce que vous trouviez un Discount valide pour la commande traitée et stocker une référence sur l'objet Order. Mapper ceci à une base de données devrait être assez simple - DayofWeek peut être stocké en tant qu'entier, DateTime et TimeSpan sont également disponibles. La partie délicate contraint la relation un-à-plusieurs entre Order et Discount. On pourrait essayer d'utiliser des déclencheurs ou des contraintes de vérification, mais je suggérerais d'appliquer cette logique uniquement dans l'application parce que vous ne gagnez pas beaucoup en l'appliquant au niveau de la base de données.

Questions connexes