【发布时间】: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