Rails数据库设计与具有不同属性的类似模型

时间:2013-05-20 02:59:43

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

我正在设计一个具有多种“请求”的应用程序,这些请求将以非常相似的性质处理,但它们包含不同的数据。

他们每个人都有大约1/3的信息相同,日期,用户信息等。

但是,不同类型的请求具有完全不同的信息,并且请求在数据库中可以包含大约30列。

即。

Form A
Date Submitted
User
Email
Provider
Attribute A
Attribute B
Attribute C
Attribute D

然后

Form A
Date Submitted
User
Email
Provider
Attribute E
Attribute F
Attribute G
Attribute H

最后我会有大约40个模型,所以不希望有单独的表格。

表示这一点的最佳方法是什么,我需要完全控制节目和表格的布局。

我之前使用HStore(使用postgres)完成了这项工作,并且想知道是否还有其他建议。

[编辑]

模型中相同属性的示例:

:company_name,:contact_person,:physical_address,:contact_email,:contact_phone

表格A的例子:

:mobile_current_provider,:num_mobile_connections,:num_smartphones,:operating_system,:num_high_voice_users

表格B的例子

:kw_per_month, :weekend_power, :three_phase_power, :seasonal_difference

大多数字段都是字符串或整数(带有一些布尔值),但都可以强制转换为字符串。大多数数据仅用于显示,而不是用于搜索和计算等的共同字段

2 个答案:

答案 0 :(得分:1)

在阅读添加的属性示例后,我的印象是他们最好属于其他模型。

我的建议是再创建两个ActiveRecord模型:MobileUsageElectricityUsage

class User < ActiveRecords::Base
  has_one :mobile_usage
  has_one :electricity_usage
end

class MobileUsage < ActiveRecords::Base
  belongs_to :user
end

class Electricity < ActiveRecords::Base
  belongs_to :user
end

好处:

  • 更好的组织。移动属于移动用户,电力属于电力使用
  • 用户中没有空数据。如果将所有属性放在一个模型用户中,则一些用户会在没有电的情况下拥有移动信息,反之亦然。这将在表中留下大量空数据。

然后,对于表单A,您只需以嵌套形式加载移动使用的属性即可。用户的属性将保存到用户,移动信息将通过引用保存到移动设备。表格B是类似的。

通过分离,您甚至可以让用户先填写基本信息,然后再详细说明。

答案 1 :(得分:0)

您不需要多个表,因此您可以使用STI

class A < C

class B < C

class C < ActiveRecord::Base

您的C表将包含所有列,共享列,A字段和B字段。