【问题标题】:Pros and cons of Single Table Inheritance for Assets in RailsRails 中资产单表继承的优缺点
【发布时间】:2023-03-11 04:39:01
【问题描述】:

我正在查看文件上传 gem,似乎倾向于将所有资产放在单个“资产”表中,并使用 STI 对其进行子类化。比如ImageAssetVideoAssetAudioAsset

我是 Rails 新手,从未使用过 STI。以前我只会制作imagesvideosaudios 单独的表格。当然,他们可能会共享几列,但我会说他们也会有一些不同的列(例如,采样率不适用于图像)

将所有这些都填充到一个“资产”表中的优点:更容易对所有资产运行查询。缺点:桌子会更快变大。我想如果这是一个问题,我总是可以在“类型”列上分片。此外,我预计图像行上的所有纯音频列都将为空,等等。

我的整个应用程序都将基于资产,因此我想在做出决定之前确定自己的利弊。有没有人做过 STI 资产并后悔过?有没有人做过并且不后悔(对于大量资产)? CTI(类表继承)在这里会是更好的解决方案吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord single-table-inheritance class-table-inheritance


    【解决方案1】:

    我想说,使用 STI 的最大缺点之一是,如果您向表中添加了一个未在所有 STI 模型之间共享的列(并且这意味着相同的事情),那么您我刚刚破坏了你的数据完整性。

    (关系)数据库中的空字段通常会导致比它们解决的问题更多的问题。

    我已经被这个问题困扰了好几次了,当你的 STI 关系中的类开始拥有自己的子类时,这尤其令人沮丧,这反过来又在表中添加了更多的列。

    我想说,如果你想让这个结构尽可能好,我真的认为 CTI 是一个更好的选择,尽管让它与 rails 一起工作可能有点棘手。至少比 STI 要复杂得多。

    在我的脑海中,我只能想到 STI 可能实际上是合理的一种情况,那就是当您处理交易模型时(例如从银行账户存款和取款等)。在这些情况下,除了交易的“方向”之外,这两种模型基本相同。

    也可以说 STI 对于快速原型制作来说“很好”,如果你只是想把一些东西放在一起快速只是为了看看它是否有效,你可以使用 STI,但是一旦您开始添加对关系中的所有模型没有意义的列,您可能应该将其重构为 CTI 或其他内容。

    【讨论】:

    • 问题是原型有一个令人讨厌的习惯,即在没有推荐的重新架构等情况下变成真正的“关键任务”应用程序。我倾向于认为 STI 几乎总是一个错误,你不应该用沙子建立你的基础。
    • @muistooshort 我知道那个故事!从逻辑上讲,在一个有大桌子的繁忙站点上,这可能是一个艰难的改变。否则,STI => CTI 看起来确实是一个非常直接的变化?我倾向于使用 STI,因为那里似乎没有一个强大的 CTI 解决方案。此外,我的查询主要在“基类”上,仅在渲染视图时专门处理(例如,当 type==video 时使用 <video>,当 type==image 时使用 <img> 等)。我想和 Tumblr 的帖子不太一样。此外,我想存储用户定义的订单(认为 jQuery 可排序),我认为使用 STI 可能更简单?
    • 我会说。 STI 仍然困扰着我。如果这些不是持久对象,我会避免继承。我只想让他们实现一个通用接口。例如,他们可能都回复#url。而且,要处理混合类型资产的“手动排序集合”,没问题,这只是 Ruby 中的数组问题。
    • Martin 为避免 NULL 列问题,您如何看待带有 PostgreSQL hstore 列作为子类属性的 STI?它并不适合所有情况,但我认为这对我来说可能没问题。如果您不熟悉 hstore,它是一种 hashmap/key-value 列类型,您可以对其进行索引和查询。我相信 Rails 甚至也会反序列化 hstore 列。
    • @aspect 听起来确实稍微好一些,但无论如何我可能会一起避免 STI。那可能是因为我感受到了它可能造成的痛苦(当时我的老板告诉我,我们没有时间正确重构它)。正如 mu 所说的太短,原型往往会变成关键任务,这很糟糕。当它们包含 STI 时,它们通常只是等待引爆的炸弹。
    猜你喜欢
    • 1970-01-01
    • 2011-05-04
    • 2012-05-29
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    相关资源
    最近更新 更多