加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 是否可以在rails中使用复合外键?

发布时间:2020-12-17 03:25:36 所属栏目:百科 来源:网络整理
导读:假设以下数据模式: Usage======client_idresourcetypeamountBilling======client_idusage_resourceusage_typerate 在这个例子中,假设我有多个资源,每个资源都可以以多种方式使用.例如,一个资源是一个小部件.小部件可以被愚弄,它们可以裸露. Gizmos也可以被
假设以下数据模式:

Usage
======
client_id
resource
type
amount

Billing
======
client_id
usage_resource
usage_type
rate

在这个例子中,假设我有多个资源,每个资源都可以以多种方式使用.例如,一个资源是一个小部件.小部件可以被愚弄,它们可以裸露. Gizmos也可以被愚弄和裸露.这些使用类型以不同的费率计费,对于不同的客户可能甚至是不同的费率.每次(资源的)使用的发生都记录在Usage表中.每个计费率(用于客户端,资源和类型组合)存储在计费表中.

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

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

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

解决方法

sourceforge显然有一个项目可以扩展Rails的ActiveRecord并支持 Composite Primary Keys.我没有使用过这个扩展,但它可能对你有所帮助.它也是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_id – > Billing.id

嗯.我制作了一张ER图,但我无法将其作为图像插入.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读