rails 应用程序中大量字段的数据库结构

Database structure for big collection of fields in rails app

我正忙于一个 rails 4/postgres 项目,该项目的结构需要特定对象的数十个字段,这就是公司。每家公司都将包括名称、位置、header_bg、徽标、联系人姓名、联系方式等字段,因此这些字段在未来可以很好地增长。构建此数据库的最佳方式是什么。

在我看来,我有 3 个选择:

1) 公司 table 所有这些字段都在同一个 table

优点:简单,数据集中在一处,方便查询

缺点:table 可能会变得非常混乱,每次需要新字段时都需要手动编辑 table 结构

~~~~~~

2) 公司 table 有一个额外的 company_options table 一个外键 company_id。这个 table 也将包含多个字段

优点和缺点与上面相同,只是结构更整洁。公司名称等重要数据将放在公司 table 中,其他数据如位置、主题、header_bg 等将放在 company_options

~~~~~~

3) 公司table和company_metatable。这将遵循 post_meta table 的 Wordpress 结构。因此它将具有以下字段:company_id、meta_key、meta_value。每个字段都在自己的行中

优点:灵活,能够动态添加 options/fields 而无需编辑 table 结构

缺点:不是在相同列中使用相同数据的简单方法。需要自定义构建此功能以插入、更新、验证数据显示。除非Rails有这样一个我找不到的gem?

~~~~~~

如有任何建议或其他选项,我们将不胜感激。是否有任何经验法则来确定所需的结构类型?出于简单性的考虑,我从第一个选项开始,但随后开始构建第三个选项,代码量似乎不适合这种常见需求。

谢谢!

为未来规划数据库模式:

一个公司可以有几个phone吗?

对于重复信息,使用新的 table:

rails g model phone number:string type:string
rails g migration add_company_id_to_phones company:references

这样您就可以添加多个 phone 并浏览您的数据库以获取每个 phone。

你的领域只有一种吗?

例如,对于每个 company,您可能只需要一个 name 字段。如果是这种情况,直接添加到companiestable:

rails g migration add_fields_to_companies name:string

你的数据是完全可选的吗?它是非结构化的吗?

将 JSONB 字段添加到您的 table,假设您使用的是 Postgresql:

rails g migration add_details_to_companies details:jsonb

对于 JSONB 数据类型,您可以像这样使用非结构化数据:

Company.create({
  name: "AwesomeCompanyCorp", 
  details: {
    "main phone": "000-0000-0000",
    "secondary phone": "000-0000-0000",
    "support email": "support email",
    "location": "Main Avenue 165",
    "latitude": "22.330213123",
    "longitude": "60.000012312"
  } 
})

使用 JSONB,您可以拥有非结构化数据,但能够像这样查询字段:

Company.where("details->>'main phone' = ?", "000-0000-0000")

考虑到这一点,选择适合您情况的最佳方法。