【问题标题】:Database structure for big collection of fields in rails appRails 应用程序中大量字段的数据库结构
【发布时间】:2018-06-20 09:41:58
【问题描述】:

我正忙于一个 rails 4/postgres 项目,该项目的结构需要为特定对象(即公司)提供数十个字段。每家公司都将包含例如名称、位置、header_bg、徽标、联系人姓名、联系人单元格等字段,因此这些字段在未来很可能会增长。构建此数据库的最佳方式是什么。

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

1) 公司表,所有这些字段都在同一个表中

优点:简单,数据集中在一个地方,易于查询

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

~~~~~~

2) 带有附加company_options 表的company 表和外键company_id。该表还将包含多个字段

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

~~~~~~

3) 公司表和 company_meta 表。这将遵循 post_meta 表的 Wordpress 结构。所以它会有以下字段:company_id、meta_key、meta_value。每个字段都在自己的行中

优点:灵活,无需编辑表格结构即可动态添加选项/字段

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

~~~~~~

任何建议或其他选项将不胜感激。是否有任何经验法则来确定所需的结构类型?为了简单起见,我从第一个选项开始,但随后开始构建第三个选项,代码量似乎不适合看起来如此普遍的需求。

谢谢!

【问题讨论】:

  • 如果将来Company表有新字段,您应该立即在运行时应用它,或者您可以更改您的项目,重新编译并部署新版本?
  • 我可以重新编译和部署,没有立即添加字段的紧迫感
  • 因此,在这种情况下您不需要选项 3。它是如此复杂,您应该有充分的理由使用它。我更喜欢选项 2。
  • 好的,谢谢@Gholamali-Irani。是的,选项 3 似乎确实是我需要的一种过度设计的方法。对于其他感兴趣的人,我对其进行了更多研究,并将其称为 EAV 模型方法(实体、属性、值),并且看起来应该尽可能避免使用它。

标签: ruby-on-rails postgresql database-design rubygems


【解决方案1】:

为未来规划您的数据库架构:

一家公司能否拥有多部手机?

对于重复信息,使用新表:

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

通过这种方式,您可以添加多部手机并浏览您的数据库以获取每部手机。

你的领域只有一种吗?

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

rails g migration add_fields_to_companies name:string

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

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

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")

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

【讨论】:

  • 嘿巴勃罗,感谢您的详尽回答!是否有任何最佳实践来确定何时使用该 JSONB 字段,而不是分成不同的字段?
  • 我会评估这些数据的重要性。如果它只需要存储详细信息,您不需要对这些字段进行大量查询,并且它会不时更改结构,我会选择 JSONB。如果您有要查询很多的数据,并且每个人都一样,我可能会选择单个数据条目和多个字段的字段。
  • 例如,如果您需要存储一个公司的传真号码,但只有一小部分公司有传真号码,那么为传真号码设置一个字段就有点过分了。而是获取非结构化详细信息的字段。如果您查看 PostgreSQL 文档,您会发现 JSONB 提供了一些字段和表的查询能力。 :)
猜你喜欢
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多