数据库 - 动态表选择

时间:2011-01-20 17:02:35

标签: ruby-on-rails database database-design

我有一个奇怪的问题,似乎无法在任何地方找到答案。我正在构建一个小型的Ruby on Rails应用程序来计算电费。

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

但我的问题是,现在有些人正在进行所谓的动态关税。因此,基本上每小时成本上升或下降取决于电网的总体需求。所以现在我有静态资费数据和动态资费数据。

我在考虑这样的事情:
客户表=> ID,名称,关税等等 关税表=> ID,类型
静态关税表=> ID,每千瓦成本,关税等。
动态关税表=> ID,每千瓦成本,TimeStamp,TariffID

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

另外,我需要记录每个动态资费的时间戳,以计算当天每小时的每小时电费使用的成本,但我不需要它用于静态的;)

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

先谢谢,

Seamus

2 个答案:

答案 0 :(得分:2)

您可能希望阅读Single Table Inheritance - 这似乎是一个很好的用例。

Stack Overflow question中有很多有关它的信息。

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

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

答案 1 :(得分:0)

您的用户可以随时间切换关税,例如从静态转为动态关税吗?如果是这样,你的架构就不够了。

此外,您没有说是否有多个基于时间的动态关税。

使用STI可以帮助您,并且符合StaticTariff和DynamicTariff都通过“是一个”关税测试的意义。但是,这两个具体实现是完全不同的,将它们的详细信息存储在同一个表中可能没有意义。

我建议像TariffCalculator.cost(:user => user, :time_range => time_range)这样的共同api,并在内部处理选择具体实现。此时不要陷入数据库结构中,只需专注于保持界面清洁和良好测试。这样你就可以在以后重构而不受惩罚:D