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
字段。如果是这种情况,直接添加到companies
table:
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")
考虑到这一点,选择适合您情况的最佳方法。
我正忙于一个 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
字段。如果是这种情况,直接添加到companies
table:
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")
考虑到这一点,选择适合您情况的最佳方法。