【问题标题】:Rails Database Design with Similar models with different attributes具有不同属性的相似模型的 Rails 数据库设计
【发布时间】:2013-05-14 13:29:34
【问题描述】:

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

他们每个人都有大约 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

大部分字段是字符串或整数(带有一些布尔值),但都可以强制转换为字符串。大部分数据只是用于显示,除了用于搜索和计算等的公共字段

【问题讨论】:

  • 一些属性示例会有所帮助。

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


【解决方案1】:

你不想要几个表,所以你可以使用 STI

class A < C

class B < C

class C < ActiveRecord::Base

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

【讨论】:

  • 这是一个坏主意,为什么在整个网络上都被打死了。我建议通过快速搜索来了解为什么会这样。我一直在研究这个话题一段时间,结论似乎是,如果模型相似但共同属性很少,只需将它们设为自己的表和模型。
【解决方案2】:

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

我的建议是再创建两个 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 型也是类似的。

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

【讨论】:

  • 这在示例中效果很好,但问题是其中会有大约 50 个,它们都是可选的,应该被视为单独的对象
  • @JamesWatling,属性越多,就越有必要将它们移动到单独的模型中并组织它们。
猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 2015-11-28
  • 2015-05-28
  • 2016-12-31
  • 1970-01-01
  • 2020-07-18
相关资源
最近更新 更多