Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 对于一个模型来说,~44列是否太多了?打破一对一的关系有意义吗?_Ruby On Rails_Ruby_Postgresql_Database Design_Database Schema - Fatal编程技术网

Ruby on rails 对于一个模型来说,~44列是否太多了?打破一对一的关系有意义吗?

Ruby on rails 对于一个模型来说,~44列是否太多了?打破一对一的关系有意义吗?,ruby-on-rails,ruby,postgresql,database-design,database-schema,Ruby On Rails,Ruby,Postgresql,Database Design,Database Schema,我对附加了大量数据的模型的最佳实践感兴趣。我的大多数应用程序都是围绕一个模型(SKU)运行的,而且似乎有越来越多的东西与之相关 例如,我的SKU模型有多个价格、维度、重量、多个价格级别的建议价格、标题、说明、保质期等。将所有定价信息拆分到另一个表中是否有意义?或者将SKU分解为SKU的不同用途,并将其关联起来?例如,WebSKU、StockSKU等。如Tom链接的答案中所述,如果所有属性都属于该模型,则没有理由将其分解。但是,如果您有price1、price2、price3或dimension\

我对附加了大量数据的模型的最佳实践感兴趣。我的大多数应用程序都是围绕一个模型(SKU)运行的,而且似乎有越来越多的东西与之相关


例如,我的SKU模型有多个价格、维度、重量、多个价格级别的建议价格、标题、说明、保质期等。将所有定价信息拆分到另一个表中是否有意义?或者将SKU分解为SKU的不同用途,并将其关联起来?例如,WebSKU、StockSKU等。

如Tom链接的答案中所述,如果所有属性都属于该模型,则没有理由将其分解。但是,如果您有
price1
price2
price3
dimension\u x\u 1
dimension\u y\u 1
dimension\u x\u 2
等列,则通常意味着您应该创建另一个表来包含这些列

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

Sku
has_many :prices
has_many :dimensions

Price
belongs_to :sku

Dimension
belongs_to :sku

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

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

我还打算让大家注意规范化规则,正如@sawa所做的那样

通常,这是一种规范化数据库的好方法,因为它提供了几个优点。你应该阅读维基百科链接(至少作为一个起点)

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

但也有它的优势。第一个(始终考虑)是优化读取性能。这基本上意味着在一个表上有数据,而在遵循正常规则时,您可能会在不同的表中有这些数据,并且当这些数据具有某种逻辑关系时,通常是有意义的

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


另一方面,我可以看到您的帖子上的标签使用的是RubyonRails,它使用的是活动记录模式。您正在介绍的数据库模型的一个结果是,您可能会有一个同样复杂的域模型。我是说,非常大。我不知道您的项目的每一个细节,但我想它将很快发展成为一个,使您的代码难以维护、扩展和理解。

考虑到DB引擎如何处理文件和内存,我认为设计数据模型是很好的。PostgreSQL的第一个瓶颈是文件IO。内存消耗也是一个重要部分。当PostgreSQL读取一些表数据时(仅供参考:仅索引扫描时不会读取表数据),它会读取8KB(编译时参数)页面。这样一个页面中的元组越多,-文件IO越少,内存消耗越少,缓存使用越好(命中率越高,预热速度越快,等等),性能越好

因此,如果有一个负载非常高的项目,考虑将常用数据分离到独立的表中是很有用的(下一步-将这些表放在SDD或强大的RAID上的单独表空间中)


也就是说,在逻辑简单性和性能调整之间应该有一些平衡。

我没有在名称后面只是数字的字段,但我有托盘条形码、商品条形码、纸箱条形码、托盘价格、纸箱价格等。将它们分开有意义吗?托盘上有条形码和价格,纸箱上有条形码和价格,等等。好点。我已经很长时间没有回顾规范化规则了。我认为基于此,我可能会将不同的包装级别划分为各自的对象。