2011-01-20 11 views
2

J'ai un problème étrange et ne peux pas sembler trouver une réponse n'importe où. Je construis une petite application Ruby on Rails pour calculer les coûts d'électricité. Pour cela, j'ai besoin de savoir quel tarif une personne pourrait être, ce qui est bien pour les tarifs normaux. (Habituellement, les gens ont un coût par kilowatt jour et nuit => Table tarifaire avec des données statiques pour chaque type de tarif)Base de données - sélection de table dynamique

Mais mon problème est que certaines personnes sont maintenant sur ce qu'on appelle un tarif dynamique. Donc, fondamentalement, chaque heure, le coût augmente ou diminue en fonction de la demande globale sur le réseau électrique. J'ai maintenant à la fois des données tarifaires statiques et des données tarifaires dynamiques.

Je pensais à quelque chose comme ceci:
Tableau client => ID, nom, TariffID, etc etc
Tarif Tableau => ID, Type de
Tarif statique Table => ID, le coût par Kilowatt, TariffID, etc
tarif tableau dynamique => ID, le coût par kilowatt, TimeStamp, TariffID

et puis selon le type de tarif dans le tableau tarifaire je sais utiliser la table statique ou dynamique.

De plus, je dois enregistrer l'horodatage de chaque tarif dynamique pour calculer le coût pour chaque heure de la journée contre la consommation d'électricité de chaque heure de la journée, mais je ne avez pas besoin pour la statique;)

Pour moi, cela semble un peu lourd et je me demandais si quelqu'un peut proposer une solution plus subtile?

Merci à l'avance,

Seamus

Répondre

2

Vous pouvez lire sur Single Table Inheritance - cela semble être un bon cas d'utilisation pour elle.

Il y a beaucoup de bonnes informations dans ce Stack Overflow question aussi.

Il semble que vous souhaitiez une table de tarifs, une classe tarifaire avec tout votre code commun, puis des classes StaticTariff et DynamicTariff qui héritent du tarif. De cette façon, vous pouvez remplacer les méthodes dans les sous-classes pour calculer le coût par heure. Le StaticTariff sera facile car il renvoie probablement une valeur de colonne dans votre base de données, alors que DynamicTariff doit probablement effectuer un calcul basé sur les dates/heures.

Tout code partagé entre les deux peut être placé en toute sécurité dans votre classe tarifaire parente et vous devriez être sur votre chemin.

+0

Merci Brett, malade lire sur STI et voir ce que je peux trouver :) – Seamus

0

Vos utilisateurs peuvent-ils changer les tarifs au fil du temps, par exemple d'un tarif statique à un tarif dynamique? Si c'est le cas, votre schéma ne sera pas suffisant. En outre, vous ne dites pas s'il existe plusieurs tarifs dynamiques basés sur le temps. L'utilisation de STI pourrait vous aider et s'intégrer dans le sens où StaticTariff et DynamicTariff passent tous les deux le test de tarification «est un». Cependant, ces deux implémentations concrètes sont suffisamment différentes pour que leurs détails ne soient probablement pas stockés dans la même table.

Je suggérerais quelque chose comme une API commune pour les deux le long des lignes de TariffCalculator.cost(:user => user, :time_range => time_range) et de faire face à la sélection de la mise en œuvre concrète en interne.Ne vous embourbez pas dans la structure de la base de données à ce stade, concentrez-vous uniquement sur le fait que l'interface reste propre et bien testée. De cette façon, vous pouvez refactoriser avec impunité plus tard: D

+0

Merci noodl, oui les utilisateurs peuvent changer de tarif au fil du temps et peuvent même avoir des tarifs dynamiques différents pour passer à. Donc, je devrais me rappeler les tarifs passés aussi pour regarder dans le temps, ce qui est assez simple je pense. Je regarde ce que vous suggérez et vois ce que je propose. Merci de votre aide :) – Seamus

Questions connexes