2011-05-11 2 views
2

je besoin d'une table qui stocke des éléments et des pistes lorsqu'un élément est ...Utilisation de l'héritage pour résoudre un problème de conception

  1. faisaient la queue
  2. marqué pour l'expédition
  3. expédié
  4. marqué pour le retour
  5. a renvoyé

Le tableau doit également indiquer combien d'éléments un cus tomer ...

  1. a reçu dans un mois
  2. a à la maison à ce moment-

J'ai essayé d'utiliser l'héritage. J'ai attribué à chaque étape un typeId (de 1 à 5, chaque identifiant représentant l'étape en cours dans le flux de travail). Cette approche n'est pas idéale car la mise à jour d'une étape de workflow efface l'historique. Par exemple, si un article passe de shipped (typeId 3) à returned (typeId 5), nous perdons un compte précis des articles expédiés.

Comment dois-je aborder cette question? De plus, je préfère conserver les données dans un tableau à moins que je n'obtienne une raison impérieuse de ne pas le faire.

Mise à jour

Les articles sont envoyés par la poste aux clients progressivement. Il y a des limites au nombre d'articles qu'un client peut recevoir au cours d'une période d'un mois, et des limites sur le nombre d'articles qu'un client peut avoir à la maison à un moment donné. Pour cet exemple, supposons 4 pour plus tôt et 2 pour le dernier. Une file d'attente de clients peut contenir n'importe quel nombre d'éléments. Pour cette raison, les éléments de la file d'attente doivent être classés de sorte que l'ordre des éléments envoyés puisse être fonction de la préférence du client.

Les articles qui ont déjà été expédiés devront être retirés du classement (le client ne peut plus modifier le classement après l'envoi d'un article).

+1

Juste pour l'enregistrement, le stockage d'une valeur de type est pas l'héritage. L'héritage implique la création de classes/sous-classes et l'héritage de membres et de données provenant d'autres classes ou objets. J'ai peut-être mal compris votre explication. –

+0

Copie possible de http://stackoverflow.com/questions/5969536/challenging-data-modeling-problem –

+0

@Catcall Marquage de l'autre pour suppression. J'ai fait un gâchis de la question et j'ai décidé de demander à nouveau. – Mohamad

Répondre

3

Aucun héritage ici. Les champs horaires sont en réalité la date et l'heure. Une ligne est entrée dans la table Tracking lorsqu'un client ajoute un élément à la file d'attente. Les autres colonnes de temps de TimeMarkedShip à TimeReturned sont NULL jusqu'à ce que l'action se produise. Le TimeQueued fait partie de la clé primaire afin de permettre à un client de louer un article plus d'une fois (sonne comme la location de vidéo pour moi).

enter image description here

Pour compter les articles qu'un client a à la maison, vous pouvez utiliser quelque chose comme

select count(1) 
from Tracking 
where CustomerID = 1755 
    and TimeShipped is not NULL 
    and TimeReturned is NULL ; 
+0

excellent exemple. Je vous remercie. Et vous avez deviné juste. Il y a un autre champ obligatoire: quand une étiquette de retour est créée. Lorsqu'un client marque un article pour le retour, un employé devra créer une étiquette d'expédition pour cela. Jusque-là, le client peut changer d'avis. – Mohamad

+0

une autre touche intéressante est le rang de l'article ... puisque les clients ne recevront pas tous leurs articles à la fois, le rang doit être appliqué uniquement pour les articles en file d'attente ... l'héritage devrait alors être utilisé, non? Étant donné que les articles commandés expédiés/traités tombent hors de l'exigence de classement. – Mohamad

+0

@Mohamad, pas sûr de comprendre le rang. Pourriez-vous mettre à jour la question avec plus de détails et un exemple? –

1

Plutôt qu'un typeID pour l'étape en cours, il semble que vous ayez besoin d'une colonne booléenne pour chaque étape. Ensuite, lorsque vous voulez compter les articles "net embarqués", vous pouvez soustraire les articles "retournés" des articles "expédiés". En outre, si vous voulez suivre l'historique, vous pouvez faire de chacune de ces étapes un champ de date nullable, afin que vous puissiez voir qu'un article a été expédié le 3/5/11 et retourné le 4/1/11. Cela peut être utile si vous utilisez cette table d'autres manières, par exemple gérer vos expéditions/réceptions ou facturer. Une valeur NULL, bien sûr, indiquerait que l'étape n'a pas encore été effectuée.