2011-01-20 49 views
2

我有一个奇怪的问题,似乎无法找到答案的任何地方。我正在构建一个小型的Ruby on Rails应用程序来计算电力成本。数据库 - 动态表选择

为此,我需要知道一个人的关税是多少,这对于正常关税是很好的。 (例如,通常人们每天都在设定每千瓦时的成本=>关于每个关税类型的静态数据的关税表)

但是我的问题是有些人现在正在进行所谓的动态关税。所以基本上每个小时的成本都会随着电网的总体需求而升高或降低。所以现在我有静态资费数据和动态资费数据。

我在想是这样的:
客户表=> ID,姓名,TariffID,等等等等
税率表=> ID,类型
静态税率表=> ID,每千瓦,TariffID成本,等
动态关税表=> ID,每千瓦成本,时间戳,关税

然后根据关税表中的关税类型我会知道使用静态或动态表。

另外,我需要记录每个动态关税的时间戳来计算对用电一天的每一个小时的一天的每个小时的费用,但我不需要它的静态的;)

对我来说,这看起来有点沉重,我想知道是否有人可以提出更微妙的解决方案?

由于事先

西莫

回答

2

你可能想在Single Table Inheritance阅读起来 - 这似乎是一个很好的使用情况吧。

这个Stack Overflow question也有很多很好的信息。

您似乎想要一个关税表,一个包含所有常见代码的关税类,然后是一个从关税继承的StaticTariff和DynamicTariff类。这样,您可以覆盖子类中的方法来计算每小时的成本。 StaticTariff很容易,因为它可能会返回数据库中的列值,而DynamicTariff可能需要根据日期/时间进行计算。

两者之间的任何共享代码都可以安全地放置在您的父级关税类中,并且您应该在途中。

+0

感谢布雷特,病了阅读STI的,看看我能想出:) – Seamus 2011-01-21 10:18:47

0

您的用户是否可以随时间变换资费?例如从静态变为动态?如果是这样,你的模式将不够用。

此外,你不会说如果有多个基于时间的动态资费。

使用STI可以帮助您,并符合StaticTariff和DynamicTariff都通过“是”关税测试的意义。然而,这两个具体的实现是非常不同的,因此将它们的细节存储在同一个表中可能没有意义。

我会建议像TariffCalculator.cost(:user => user, :time_range => time_range)这两行的常见API,并处理在内部选择具体实现。在这一点上不要陷入数据库结构中,只关注保持界面清洁和经过良好测试。这种方式,你可以重罚随后不受惩罚:D

+0

感谢noodl,是用户可以随时间转换关税,甚至可以有不同的动态关税切换到。所以我需要记住过去的关税还可以回顾一下我认为很简单的时间。我看看你的建议,看看我想出了什么。谢谢你的帮助 :) – Seamus 2011-01-21 10:20:46