~44 列对于模型来说太多了吗?打破 one-to-one 关系有意义吗?

Is ~44 columns too much for a model? Does it make sense to break a one-to-one relation?

我对附加大量数据的模型的最佳实践很感兴趣。我的大部分应用程序都围绕着一个模型 (SKU) 展开,而且与之关联的东西似乎越来越多。

例如,我的 SKU 型号有多个价格、尺寸、重量、多个价格级别的推荐价格、标题、描述、保质期等。将所有定价信息分解为另一个是否有意义table?或者将SKU分解成SKU的不同用途并将它们关联起来?例如WebSKU、StockSKU等

如 Tom 链接的答案中所述,如果您的所有属性确实属于该模型,则没有理由将其分解。但是,如果您有 price1price2price3dimension_x_1dimension_y_1dimension_x_2dimension_y_2 等列, 那么它通常意味着你应该创建另一个 table 来包含这些。

例如,您可以将其设置为具有以下型号

Sku
has_many :prices
has_many :dimensions

Price
belongs_to :sku

Dimension
belongs_to :sku

数据库的设计不应该根据它有多少列,而是根据逻辑,特别是在 Codd's normal forms 之后。如果您的数据库中存在系统冗余,那么这是将其拆分为多个表的标志。如果没有,请保持原样。

正如其他人所说,数据库的设计应该响应其背后的逻辑。为什么?主要是因为这样会更容易维护和理解。

我也打算像@sawa 那样引起人们对规范化规则的关注。

一般来说,这是一种规范化数据库的好方法,因为它有几个优点。您应该阅读 this 维基百科 link(至少作为起点)。

遵循常规规则将有助于您在设计数据库时考虑到数据背后的逻辑。

但是denormalization也有它的优点。第一个(一直被认为是)优化读取性能。这基本上意味着在一个 table 上拥有数据,而在遵循正常规则时,您会在不同的 table 上拥有数据,并且当该数据具有 一些 逻辑时通常是有意义的关系。

你必须根据你面临的问题来达到平衡。

另一方面,对于您 post 上的标签,我可以看到您在 rails 上使用 ruby,它使用活动记录模式。您所呈现的数据库模型的一个结果是,您可能会拥有一个同样复杂的域模型。我的意思是,非常大。我不知道关于您的项目的每个细节,但我猜它会迅速成长为一个 god object,使您的代码难以维护、扩展和理解。

我认为设计数据模型很好,考虑到数据库引擎如何处理文件和内存。 PostgreSQL 的第一个瓶颈是文件 IO。内存消耗也是一个重要的部分。当 PostgreSQL 读取一些 table 数据时(仅供参考:table 数据未在 Index-Only-Scans 处读取)它读取 8 KB(编译时间参数)页面。这样一个页面中的元组更多,- 更少的文件 IO,更少的内存消耗,更好的缓存使用(更频繁的命中,快速预热等),更好的性能。

因此,如果一个人确实有一个 high-loaded 项目,考虑将常用数据分离到孤立的 table 可能会很有用(作为下一步 - 将此 tables 到 SDD 或强大的 RAID 上的单独 table 空间。

即逻辑简单性和性能调整之间应该有一些平衡。