当前位置:  开发笔记 > 后端 > 正文

是否可以在轨道中使用复合外键?

如何解决《是否可以在轨道中使用复合外键?》经验,为你挑选了1个好方法。

假设以下数据模式:

Usage
======
client_id
resource
type
amount

Billing
======
client_id
usage_resource
usage_type
rate

在这个例子中,假设我有多个资源,每个资源都可以以多种方式使用.例如,一个资源是a widget. Widgets可以foo编辑,他们可以bar编辑. Gizmos也可以foo编辑和bar编辑.这些使用类型以不同的费率计费,对于不同的客户可能甚至是不同的费率.每次(资源的)使用的发生都记录在Usage表中.每个计费率(用于客户端,资源和类型组合)存储在计费表中.

(顺便说一下,如果这个数据模式不是解决这个问题的正确方法,请提出建议.)

是否可以使用Ruby on Rails和ActiveRecord创建has_many从Billings到Usages 的关系,以便我可以获得给定计费率的使用情况列表?有has_many, :through没有我不知道的语法?

再一次,我可能会从错误的角度处理这个问题,所以如果你能想到更好的方法,请大声说出来!



1> Bill Karwin..:

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图,但我无法将其作为图像插入.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有