2010-01-25 8 views
0

je une base de données qui a les relations suivantes:[MySQL]: vue de table ou table réelle. (Traçant une clé primaire)

Transaction->Purchase->Item->Schedule 

Transaction - self explanitory 
Purchase - any purchase info that relates to the item being purchased (quantity, if the user purchases more than one item). A given Transaction can have more than one Purchase_ID tied to it. 
Item - Stores Item info and relates it to individual clients. 
Schedule - determines the price of an item at a given time of day. 

J'ai besoin d'exécuter une requête qui doit sélectionner une série de valeurs de l'annexe sur la base si Transaction.TimeStamp est fourni dans un date- gamme. La requête doit sélectionner une valeur dans Schedule en fonction de sa clé primaire. La clé primaire n'est pas traçable à partir de la transaction.

Afin de résoudre ce problème, j'ai décidé de créer une table pour lier Transaction DIRECTEMENT au primaire de Schedule.

Récemment, j'ai découvert Table Views - serait-ce une situation appropriée pour faire une table "vue"? Ou devrais-je simplement créer une table 'réelle' TransactionSchedule?

transactionSchedule 
Transaction_ID Schedule_ID 

Mon problème est que je ne comprends pas les détails quand une vue de tableau est utile/quels sont les avantages.

Est-ce que vous avez une table individuelle pour Tracer la transaction-> Overkill Schedule?

Vraiment n'importe quelle orientation générale avec ce problème serait très appréciée.

EDIT: cette requête est seulement pour récupérer des données qui ont déjà été saisies

--thanks

Répondre

2

Je vous encourage vivement à copier le prix du programme directement à l'achat dès que vous l'insérez. De cette façon, vous avez résolu votre problème et, en même temps, vous éviterez qu'un autre prix soit facturé au client plus tard si vous modifiez accidentellement (ou intentionnellement) l'horaire. En ce qui concerne la clé primaire de la planification, et ce n'est pas traçable à partir d'une transation: c'est un signe de mauvaise conception. Je veux dire, pensez-y - vous avez un horodatage dans la transaction, un calendrier par définition est placé dans le temps en utilisant un horodatage de et à - pourquoi ne pouvez-vous pas les relier? AFAICS, clé primaire du programme devrait être item_id, from_timestamp, to_timestamp

En supposant que votre table de planification a partir et d'horodater Ma requête serait

SELECT  ..your columns.. 
FROM  Transaction t 
INNER JOIN Purchase p 
ON   t.id  = p.transaction_id 
INNER JOIN Item  i 
ON   p.id  = i.purchase_id 
INNER JOIN Schedule s 
ON   i.id  = s.item_id 
AND  t.timestamp BETWEEN s.from_timestamp 
          AND s.to_timestamp 

En ce qui concerne, si vous utilisez une vue ou non - vraiment, il est à toi. Une vue ne fonctionne pas mieux ou pire qu'une requête, la seule différence est que la définition est stockée dans la base de données. Les principaux avantages de ce sont

  • personnes peuvent réutiliser la définition sans copier la requête (et déconner vers le haut), le
  • vous pouvez modifier le schéma dans une certaine mesure et se cacher que de l'application à condition que vous mettez à jour le voir en conséquence (ce dernier avantage est souvent surestimé)
+0

"que" comme dans l'achat, ou l'information d'horaire?Il résout le problème, mais le système de planification fonctionne comme prévu lors de la gestion de ces événements - cette requête est seulement pour récupérer les données qui ont déjà été saisies. –

+0

que comme dans l'achat. –

+0

et assez curieusement, le système fait déjà cela (ajouter le prix à l'achat) - moi et mon collègue, qui n'a pas construit cette DB, a convenu que le prix devrait probablement être omis de l'achat –

0

L'enregistrement de transaction ne peut-il pas avoir une clé étrangère liée à la clé primaire de planification? ou est-ce une relation plusieurs-à-plusieurs. De toute façon, je ne vois pas la vue comme appropriée ici.

+0

Pourquoi la vue n'est-elle pas appropriée? –