假设以下数据模式:
Usage
======
client_id
resource
type
amount
Billing
======
client_id
usage_resource
usage_type
rate
在此示例中,假设我有多个资源,每个资源都可以通过多种方式使用。例如,一个资源是widget
. Widgets
can be foo
ed,他们可以是bar
ed. Gizmo
也可以是foo
ed and bar
编辑。这些使用类型按不同的费率计费,甚至可能针对不同的客户采用不同的费率。每次使用(资源)的发生都记录在使用表中。每个计费费率(针对客户端、资源和类型组合)都存储在计费表中。
(顺便说一句,如果这个数据模式不是解决这个问题的正确方法,请提出建议。)
是否可以使用 Ruby on Rails 和 ActiveRecord 创建一个has_many
从账单到使用情况的关系,以便我可以获得给定账单费率的使用实例列表?是否有语法has_many, :through
我不知道吗?
再次,我可能从错误的角度处理这个问题,所以如果你能想到更好的方法,请大声说出来!
显然,sourceforge 有一个项目来扩展 Rails 的 ActiveRecord,支持复合主键 http://compositekeys.rubyforge.org/。我没有使用过这个扩展,但它可能对你有帮助。它也是 rubyforge 上的一颗宝石。
从版本 2.0 开始,Plain Ruby on Rails 不支持复合主键(参见 2.0)。如何使用旧模式 http://wiki.rubyonrails.org/rails/pages/howtouselegacyschemas)。每个表必须有一个名为“的单列自动增量键”id
".
我看到的解释是:“如果您想使用旧数据库,则只需要复合主键。”这当然是对数据建模的一种可笑的无知观点。
我看到的解决方案是:
- 使用.client_id -> Client.id
- 使用情况.type_id -> 使用情况类型.id
- 使用.resource_id -> 资源.id
- Billing.usage_id -> 使用情况.id
- Billing.client_id -> Client.id
- Billing.type_id -> 使用类型.id
- Billing.resource_id -> Resource.id
明显多余的外键Billing
尝试强制执行部分引用完整性。但它并没有完全实现这一目标——它并不能阻止你在Billing
引用一行Usage
客户端/资源/使用类型组合错误,与计费表中引用行中的组合不匹配。
edit:@Yarik:是的,你是对的。这更有意义Usage
参考Billing
.
唔。我制作了 ER 图,但在将其作为图像插入时遇到问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)