【问题标题】:Design a Book model with several editions in a database在数据库中设计具有多个版本的 Book 模型
【发布时间】:2014-08-12 05:33:33
【问题描述】:

我有一个教科书模型,我想拥有同一教科书的多个版本(允许每个版本有不同的标题、价格等),并且能够检索特定教科书的所有版本。你会如何设计这种关系?

我的想法是将本书的第一个实例作为根书,并将所有后续书籍版本与它相关联。例如,如果我要删除根书,则应从现有版本中自动选择另一个任意根。

我查看了 Ancestry gem,但考虑到我的树的最大深度为 1,这看起来有点过头了。同样,我什至不确定树结构是否是正确的解决方案。

【问题讨论】:

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


【解决方案1】:

在现实世界中,书是乱七八糟的。

我不确定我是否见过一本书有不同标题的多个版本,但我想没有法律禁止这样做。如果这真的可以发生,那么我们可能需要按照一组版本作为任意标题集合的思路来思考。

假设我们从这个开始。想象一下,不同版本的标题可能不同,尽管它们不是这本实际的书。 (拉森的微积分和斯皮瓦克的微积分。)

书名 ISBN 价格版 -- 微积分 128505709-0 $235.34 10 微积分 128509108-6 $ 86.50 10 微积分 054716702-4 $290.65 9 微积分 061850298-X $67.96 8 微积分 039586974-9 $ 56.99 6 微积分 091409891-8 $ 80.75 4

我们不能按标题选择一组版本,因为我们让不同版本的标题有所不同,而且同一标题可以由不同的作者撰写。 (上面的前五本是拉森的微积分;最后一本是斯皮瓦克的微积分,完全不同的教科书。)一个版本可以由不同的出版商出版,在这种情况下,标题、作者(未显示)和版本相同,而 ISBN 不同。 (通常,书名的精装本和平装本由不同的出版商出版。)

这意味着我们需要另一张桌子。

版本名称 ISBN -- 拉森微积分 128505709-0 拉森微积分 128509108-6 拉森微积分 054716702-4 拉森微积分 061850298-X 拉尔森的微积分 039586974-9 斯皮瓦克的微积分 091409891-8

一方面,很明显,这确实是我们获取有关一组版本的所有信息所需的全部内容。只需加入 ISBN。当然,在 Rails 中,您可能会一直使用 id 编号。

版本名称​​可以是一个标题,但我们允许在一本书的不同版本之间改变标题。所以选择一个标题可能会导致比它解决的问题更多的问题。

所以我认为您不需要其他宝石来处理此问题。只是多了一个模型和正确的关联。

【讨论】:

    【解决方案2】:

    我可能会为此设置一个简单的 has_many / belongs_to 关联:

    #app/models/book.rb
    Class Book < ActiveRecord::Base
       has_many :editions
    end
    
    #app/models/edition.rb
    Class Edition < ActiveRecord::Base
       belongs_to :book
    end
    

    这将为您提供架构:

    #books
    id | title | author | created_at | updated_at
    
    #editions
    id | book_id | ISBN | price | created_at | updated_at
    

    这将允许您将@book 与特定的title / author 一起保存,然后将任意数量的editions 与该书关联起来。

    【讨论】:

      【解决方案3】:

      采用自我参照的方法被证明是最简单的方法。我设计它的方式是添加到数据库的第一个版本是根,所有后续版本都通过parent_id 属性引用它。然后进行大量验证以确保此类结构的完整性(例如,一组版本只能有一个根,删除根书会自动从现有图书版本中选择另一个根,等等)。

      【讨论】:

        猜你喜欢
        • 2016-12-31
        • 1970-01-01
        • 2012-10-10
        • 1970-01-01
        • 2014-01-21
        • 2011-05-03
        • 1970-01-01
        • 2020-03-12
        • 2018-02-17
        相关资源
        最近更新 更多