【问题标题】:One "not-so-normalised' table vs Two normalised tables - rails一个“不那么规范化”的表与两个规范化的表 - rails
【发布时间】:2014-04-15 17:10:26
【问题描述】:

我被一个设计决定困住了。似乎我的问题的答案总是取决于具体情况。这是我的情况:

在我的关系数据库中,我已经有一个类别和子类别表。您可以创建链接到类别或子类别的帖子和 cmets。

在我的数据库中拥有一个帖子和一个 cmets 表并在评论和帖子表中包含一个“类型”字段以区分帖子/评论属于类别还是子类别是否明智。

还是将帖子和评论表拆分为 category_post/category_comment 和 sub_category_post/sub_category_comment 表更好?

我正在寻找可以优化速度的解决方案。我还希望遵循一种可扩展的架构模式,因为 post 和 cmets 的大小可以很快增长。

谢谢

【问题讨论】:

    标签: ruby-on-rails database architecture psql


    【解决方案1】:

    第一个,绝对是:一个帖子表和一个 cmets 表。我会给他们每个人一个 category_id 字段和一个 subcategory_id 字段,所以每个人都可以链接到一个类别和/或子类别。我认为您不需要 type 字段。

    我很想进一步简化它,甚至没有单独的子类别表:相反,使类别成为“树”类型模型,即类别中有一个 category_id 字段,因此可以嵌套类别。然后,您可以拥有 a) 多个级别的类别嵌套,这在某些时候可能是一个要求,并且 b) 存在类别和子类别之间没有逻辑差异的情况,除了数据中定义的差异 (即它们是如何嵌套的),这使您的应用程序更简单(并且简单 = 好)。

    所以:

    #fields - category_id
    Post
      has_many :comments
      belongs_to :category
    
    #fields - post_id, category_id
    Comment
      belongs_to :post
      belongs_to :category  
    
    #fields - parent_id
    Category
      has_many :posts
      has_many :comments
      belongs_to :parent, :class_name => "Category", :foreign_key => :parent_id
      has_many :children, :class_name => "Category", :foreign_key => :parent_id
    

    【讨论】:

    • 谢谢你,马克斯。哇,希望我两个月前在分别制作 category 和 sub_category 表之前与您交谈过。以后会牢记在心。现在,我将使用您的第一组建议。
    • 我在设计模式时尝试使用的一个有用的启发式方法是“想象一下我的老板在 12 个月后出现并增加了一些要求:我现在如何保持简单以便以后灵活?”
    • 我正在尝试实现父子模型。我目前遇到的一些问题是类别和子类别具有不同的字段,例如类别具有名称、郊区和城市字段,而子类别只有一个名称字段。我不太担心我的桌子没有被标准化。我担心的是失去我通常对类别强制执行的验证,但现在我可能需要关闭验证以允许在同一个表中创建子类别。有什么办法吗?
    • 你应该把它放在一个新问题中。
    猜你喜欢
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 2018-02-13
    相关资源
    最近更新 更多