假设以下数据模式:
Usage ====== client_id resource type amount Billing ====== client_id usage_resource usage_type rate
在这个例子中,假设我有多个资源,每个资源都可以以多种方式使用.例如,一个资源是a widget
. Widgets
可以foo
编辑,他们可以bar
编辑. Gizmo
s也可以foo
编辑和bar
编辑.这些使用类型以不同的费率计费,对于不同的客户可能甚至是不同的费率.每次(资源的)使用的发生都记录在Usage表中.每个计费率(用于客户端,资源和类型组合)存储在计费表中.
(顺便说一下,如果这个数据模式不是解决这个问题的正确方法,请提出建议.)
是否可以使用Ruby on Rails和ActiveRecord创建has_many
从Billings到Usages 的关系,以便我可以获得给定计费率的使用情况列表?有has_many, :through
没有我不知道的语法?
再一次,我可能会从错误的角度处理这个问题,所以如果你能想到更好的方法,请大声说出来!
sourceforge显然有一个项目可以扩展Rails的ActiveRecord并支持复合主键.我没有使用过此扩展程序,但它可能会对您有所帮助.它也是rubyforge的宝石.
从版本2.0开始,Plain Ruby on Rails不支持复合主键(参见HowToUseLegacySchemas).每个表必须有一个名为" id
" 的单列自动增量键.
我看到的解释是:"如果你想使用遗留数据库,你只需要复合主键." 这当然是数据建模的一种荒谬无知的观点.
我看到的解决方案是:
Usage.client_id - > Client.id
Usage.type_id - > Usagetype.id
Usage.resource_id - > Resource.id
Billing.usage_id - > Usage.id
Billing.client_id - > Client.id
Billing.type_id - > Usagetype.id
Billing.resource_id - > Resource.id
显然是多余的外键,Billing
试图强制部分参照完整性.但它并没有完全实现 - 它不会阻止您使用错误的客户端/资源/用法类型组合在Billing
该引用中创建行Usage
,而不是与Billing表中的引用行中的行匹配.
编辑: @Yarik:是的,你是对的.Usage
引用更有意义Billing
.
Usage.billing_id - > Billing.id
嗯.我制作了一张ER图,但我无法将其作为图像插入.