我正在设置一个可能有70列以上的表格。我现在正在考虑将其拆分,因为每次访问表时都不需要列中的某些数据。再说一次,如果我这样做,我就不得不使用联接。
在什么时候(如果有的话)是否认为列太多?
我正在设置一个可能有70列以上的表格。我现在正在考虑将其拆分,因为每次访问表时都不需要列中的某些数据。再说一次,如果我这样做,我就不得不使用联接。
在什么时候(如果有的话)是否认为列太多?
Answers:
不需要每个查询都返回所有列的事实是完全正常的;这就是为什么SELECT语句可让您显式命名所需列的原因。
通常,您的表结构应反映您的域模型。如果您确实拥有属于同一实体的70个属性(100个,您拥有什么),则没有理由将它们分成多个表。
select count(*) from votes
每次计算的,还是您认为它是非规范化的?这是否会使SO数据库变坏并使Jeff Atwood疯狂?
将表拆分为几列,减少列数,这也有一些好处,这也称为“ 垂直分区”。这里有一些:
如果您的表具有许多行,则修改索引可能会花费很长时间,因为MySQL需要重建表中的所有索引。将索引分成几个表可以使速度更快。
根据您的查询和列类型,MySQL可能正在将临时表(用于更复杂的选择查询)写入磁盘。这很不好,因为磁盘I / O可能是一个很大的瓶颈。如果查询中有二进制数据(文本或Blob),则会发生这种情况。
不要过早地进行优化,但是在某些情况下,您可以从较小的表中获得改进。
当它违反规范化规则时,它太多了。如果要规范化数据库,那么很难获得那么多列。设计数据库以对问题进行建模,而不是围绕任何针对特定数据库平台进行优化的人为规则或想法。
将以下规则应用于宽表,则单个表中的列可能会少得多。
这是一个可以帮助您的链接。
It is pretty hard to get that many columns if you are normalizing your database.
不像看起来那么难。
除非所有属性都属于同一实体并且彼此不依赖,否则这不是问题。为了让生活更轻松,您可以将一个带有JSON数组的文本列存储在其中。显然,如果您每次都获取所有属性都没有问题。尽管这将完全破坏将其存储在RDBMS中的目的,并使每个数据库事务都大大复杂化。因此,不建议在整个数据库中都遵循这种方法。