【问题标题】:ActiveRecord tables with many columns: is there a better way?具有许多列的 ActiveRecord 表:有更好的方法吗?
【发布时间】:2015-11-10 00:58:33
【问题描述】:

我想知道我是否恰当地使用表属性来描述对象,或者对于某些类型的属性是否有更有效和更可取的方法。

我有两个 ActiveRecord 表,foodslists。两个表都有很多列,因为每个对象都有很多属性(卡路里、脂肪、蛋白质等)。

除了这些内在特征之外,我还发现自己在表中添加了代表对象在组中的成员资格或用户定义属性的属性列。

组成员身份数据表明食物是甜点还是肉类,以及其他类别。为此,我有包含二进制或分类 (char) 数据的列。

用户定义的属性数据包括列表的“最大卡路里”或“最大脂肪”属性。如果我有一个对应于每个“总”的“最大”列(例如,“最大卡路里”和“总卡路里”),这当然会使列数加倍。

甜点和肉类是内在属性,因为它们不能由用户更改,但它们似乎可以更有效地由一组食物 ID 或哈希表示。有这么多数据点(和列)来表示这个简单的分类似乎是多余的,而且我的表太大了。我没有切换到组成员数据的数组的原因是因为我喜欢对象本身当前如何访问这些数据。它直观、集中,而且似乎不太容易出错。

我不知道如何管理用户定义的列表“最大值”,也许这种列/属性的扩散是最好的选择。

如果对我的方法和可能替代方案的建议有任何建议或评价,我将不胜感激。

【问题讨论】:

  • 哪个数据库系统?如果您使用 Postgres,您可以将扩展属性存储在 JSON 类型的列中。
  • 我正在使用 PostgreSQL。我会调查一下。谢谢!
  • 谢谢@Sean;我已经取得了一些进展。我现在有一个包含数据的 JSON 列。尽管我可以使用在 create 方法中调用的服务对象来更新值,但我无法让用户进行编辑。当我允许用户通过 form_for 编辑 JSON 值时,无法识别用户输入的值(nil:NilClass 的未定义方法“[]”)。另一个线索是,当我包含一个存在:真正的验证时,即使有一个值,我也会收到“不能为空白”的错误。你对探索什么有什么建议吗?谢谢。

标签: ruby-on-rails activerecord database-design


【解决方案1】:

您可以使用序列化并将文本对象存储在数据库中,但是当您选择它时,它将再次作为 HASH 或 ARRAY 访问,这可以为您解决问题,而不是复制字段将其存储为 HASH 然后从中读取.

看看这个:

Rails: Serializing objects in a database?

http://apidock.com/rails/ActiveRecord/Base/serialize/class

【讨论】:

  • 谢谢。我已经利用了这个;此外,我对向模型添加属性不再犹豫。当我问这个问题时,我害怕“列太多”,但现在我不知道为什么。我没有那么多属性,最好将它们存储为单独的属性而不是序列化的文本对象,这取决于具体情况。
猜你喜欢
  • 2018-12-29
  • 2023-01-31
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多