Rails数据库设计有或没有关联

时间:2016-02-06 15:49:48

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

关于使用Rails进行数据库设计的问题。

我想知道我是否走在正确的轨道上,或者我是否让事情过于复杂。

场景:显示以下内容的公司列表:

  • 公司名称
  • 生物
  • 网站地址
  • 电子邮件
  • 电话号码
  • 地址
  • 社交媒体链接

我认为创建由数据库支持的4个模型是个好主意。

  • 公司
  • 号码(公司可以有多个电话号码(陆地,传真,寻呼机)
  • 地址(公司可以有多个地点)
  • 链接(社交媒体:Facebook,谷歌,LinkedIn

我有两个问题。

  1. 是否可以简单地让1个表包含所有字段,并在需要时继续添加,例如。新的社交媒体网站。这是不好的做法吗?
  2. class Company < ActiveRecord::Base
      # Table name = Companies
      # name     :string
      # bio      :text
      # url      :string
      # email    :string
      # phone    :string
      # Location information
      # address1 :string
      # address2 :string
      # city     :string
      # state    :string
      # postcode :string
      # country  :string
      # Social media links
      # facebook :string
      # google   :string
      # linkedin :string
    end
    
    1. 如果将以下内容分解为最佳实践,是否会有任何性能优势,可以通过外键/ has_many,belongs_to association来设置它?
    2. class Company < ActiveRecord::Base
       # Table name = Companies
       # name     :string
       # bio      :text
       # url      :string
       # email    :string
       # phone    :string
      
        has_many :locations
        has_many :social_media_links
      end
      
      class Number < ActiveRecord::Base
        # Table name = Numbers
        number      :string
        company_id  :integer
      
        belongs_to :company
      end
      
      class Location < ActiveRecord::Base
        # Table name = Locations
        # address1     :string
        # address2     :string
        # city         :string
        # state        :string
        # postcode     :string
        # country      :string
        # company_id   :integer
      
        belongs_to :company
      
        # I presume, you could also create a Country and State model
        # and create a has_many and belongs_to associations, 
        # to allow for selections like in a dropdown box?
      end
      
      class SocialMediaLink < ActiveRecord::Base
        # Table name = SocialMediaLinks
        name        :string
        url:        :string
        company_id  :integer
      
        belongs_to :company
      end
      

      感谢您查看此问题。此外,如果有Rails开源项目,您可以建议学习并查看他们如何设计他们的数据库/活动记录关联,请告诉我。

1 个答案:

答案 0 :(得分:1)

  

我想知道我是否走在正确的轨道上

你是,这是一个有效的问题。

如何构建数据的最大决定因素必须来自应用程序的范围。

如果您希望Company有多个locationssocial media profiles等,那么,您最好分割数据。如果你只是期望公司拥有单一的数据,那么你只会给自己带来更多的问题而不是它的价值。

<强>扩展

  

如果需要,继续添加

您正在寻找的是 extensibility - 能够根据需要向您的系统添加数据。

如果您的公司拥有严格的数据结构,那么您可以使用单个模型/表格。如果您想添加额外的字段(新的social帐户等),正确的做法是使用多模型方法。从技术上讲,两者都没有错。

-

我建议最好的方法是将嵌套模型嵌入 modules

#app/models/company.rb
class Company < ActiveRecord::Base
  has_many :locations, class_name: "Company::Location", dependent: :destroy
end

#app/models/company/location.rb
class Company::Location < ActiveRecord::Base
  belongs_to :company
end

您应该只创建依赖模型,如果您需要为上述模型添加额外的记录/数据。