MySQL:多个表或一个表与许多列?
所以这更像是一个devise问题。 我有一个主键说用户的ID,我有大量的信息与该用户相关联。 我应该根据这些信息将多个表分成不同的类别,或者我应该只有一个多列的表?
我曾经这么做的方式是拥有多个表,比如一个表用于应用程序使用数据,一个表用于configuration文件信息,一个表用于后端令牌等,以使事物看起来有组织。 最近有人告诉我,最好不要这样做,而且有一个很多列的表是好的。 事情是所有这些列都有相同的主键。
我对数据库devise相当陌生,所以哪种方法更好,有什么优点和缺点? 传统的做法是什么?
任何时间信息都是一对一的(每个用户都有一个名字和密码),那么最好把它放在一张表中,因为它减less了数据库检索结果所需的连接数量。 我认为有些数据库对每个表的列数有限制,但在正常情况下我不担心,如果需要的话可以随时拆分。
如果数据是一对多的(每个用户有数千行的使用信息),那么它应该被拆分成单独的表来减less重复的数据(重复的数据会浪费存储空间,caching空间,并使数据库更难维护)。
你可能会发现维基百科关于数据库规范化的文章很有趣,因为它深入地讨论了这个问题的原因:
数据库规范化是组织关系数据库的字段和表以最小化冗余和依赖关系的过程。 规范化通常涉及将大型表分成较小(较less冗余)的表格并定义它们之间的关系。 其目的是隔离数据,以便只需在一个表中添加,删除和修改字段,然后通过定义的关系通过数据库的其余部分进行传播。
非规范化也是需要注意的,因为有些情况下重复数据更好(因为它减less了数据库在读取数据时需要完成的工作量)。 我强烈build议尽可能使数据尽可能标准化,并且只有在意识到特定查询中的性能问题时才进行规范化处理。
一张大桌子往往是一个糟糕的select。 相关的表格是关系数据库被devise来处理的。 如果您正确编制索引并知道如何编写高性能查询,它们将会正常工作。
当表格的列数太多时,可能会遇到数据库存储信息页面的实际大小问题。 要么这个logging最终会变得对页面来说太大了,在这个页面中,你最终可能不能创build或者更新一个让用户不快的特定logging,或者你可能(至less在SQL Server中)允许某些特定的溢出数据types(有一套规则,如果你这样做,你需要查找),但是如果很多logging会溢出页面大小,你可能会产生性能问题。 现在,MYSQL如何处理这些页面,以及在潜在页面大小变得太大时是否遇到问题,您必须在该数据库的文档中查找。
问问自己这些问题,如果你把所有的东西都放在一张桌子上,你会为这个用户有多行吗? 如果您需要更新用户,您是否要保留审计跟踪? 用户可以有多个数据元素的实例吗? (比如电话号码)你会有一个情况,你可能想在以后添加一个元素或一组元素? 如果你回答是,那么很可能你想拥有外键关系的子表。
父/子表的优点是数据的完整性,性能通过索引(是的,你也可以在一个平坦的桌子上做),如果以后需要添加一个字段,尤其是如果它是必填字段,则IMO更容易维护。
缺点devise比较困难,查询变得稍微复杂一些
但是,有很多情况下,一个大平台将是适当的,所以你必须看看你的情况来决定。
我有一个很好的例子。 过度标准化的数据库与以下一组关系:
people -> rel_p2staff -> staff
和
people -> rel_p2prosp -> prospects
人在哪里有名字和人的细节,员工只有员工的logging细节,前景只是前景的细节,而相对表则是与员工和前台联系的人与外键的关系表。
这种devise对整个数据库进行。
现在要查询这组关系,每次都是一个多表连接,有时会有8个以上的表连接。 到今年中期,一直工作得很好,现在开始变得非常缓慢,现在我们已经超过了四万人的logging。
索引和所有低挂水果去年已经用完,所有的查询都进行了优化,以达到完美。 这是特定的规范化devise和pipe理的结束,现在批准了整个应用程序的重build,依赖于它和数据库的重组,在6个月内。 $$$$ Ouch。
解决办法是直接关系到people -> staff
和people -> prospect
我已经完成了某种数据库devise。 对我来说,这取决于数据库pipe理系统的难度; 是的,只有在一个地方有独特的数据是真实的,但真正难以用过多的规范化数据库查询有很多logging。 只要结合两个模式; 如果你觉得自己会拥有一个像facebook,gmail等那样难以维护的大量logging,那就用一张巨大的表。 并使用不同的表为一套简单的系统logging…以及这只是我的意见..我希望它可以帮助..只是做它..你可以做到这一点… 🙂
这样做的传统方式是使用不同的表格,如星型模式或雪花模式。 Howeevr,我会基于这个战略是两倍。 我相信数据应该只存在于一个地方的理论,因为我提到的模式会运作良好。 不过,我也相信,对于报表引擎和商务智能套件,由于报表需求更加支持,所以列式方法将非常有益。 类似于infobright.org的列式方法具有巨大的性能提升和压缩,这使得使用这两种方法非常有用。 许多公司开始意识到,组织中只有一个数据库体系结构不支持其全部需求。 许多公司正在实施具有多个数据库架构的概念。
我认为有一个单一的表格更有效,但是你应该确保表格的组织方式能够显示同一行的关系,趋势以及variables的差异。 例如,如果表格显示了学生的年龄和成绩,那么您应该以感谢最高得分手的方式与最低得分手进行良好的区分,学生的年龄差异是平均的。