数据库结构 - 连接还是不连接

3
我们正在使用MySQL Workbench为一个新应用程序制定数据库结构,随着多对多关系的增加,使列表数据所需的连接数量急剧增加。
这个应用程序将是一个读取密集型应用程序,并且每个表格将有数十万行。
以下是问题:
1. 减少连接,通过合并表格是否真的那么糟糕?
2. 是否应该开始考虑水平分区?(与合并表格一起)
3. 是否有比透视表更好的处理多对多关系的方法?
4. 我们讨论过将所有数据存储在序列化的文本列中,并让应用程序进行排序,而不是让数据库进行排序。但是这似乎是个非常糟糕的想法,即使数据库被大量缓存。你认为呢?
6个回答

4

采用数据库的规范化形式。对于大部分任务,您不需要超过3或4个连接,仍然可以为最常见的连接编写视图。反规范化将使您始终考虑在更改一个属性时在多个位置/表中更新字段,并且肯定会带来比好处更多的问题。

如果您担心报告性能,则仍然可以将数据定期批量提取到单独的表中,以获得所需的报告查询性能。如果是为了查询简单性,则可以使用视图。


谢谢!我们实际上已经涉及了8-9个连接,而且核心部分肯定会有增加,所以未来10-15个连接可能并不完全不可能。 - Industrial
3
从规范化开始。明确您对性能的要求。进行测量。如果表现不佳,战略性地去规范化,直到达到您的要求为止。 - matt eisenberg

3

倒序列出:

  • 算了吧,使用数据库。那些说“在应用程序中制作它”的人往往对编写数据库所需的工作量一无所知。

  • 取决于确切的需求。

  • 取决于确切的需求。OLTP(事务处理)-采用第五范式。OLAP(分析处理)-采用适当的星型图并进行去规范化以获得最佳性能。混合-算了吧。由于理论不同,对于较大的安装无效...除非您使数据库成为OLTP,然后使用特殊的OLAP立方体数据库(mySQL没有)。


2

数据库被设计用于处理大量的连接。利用这个特性可以使得在数据库中进行许多种数据操作变得更加容易。否则,为什么不直接使用平面文件呢?


我一直被告知要进行规范化,再规范化,再规范化。然后连接数量增加,我被告知这会立即降低性能。 - Industrial
当数据集增长时,太多的连接会影响性能。数据库显然有许多其他优点,而不仅仅是能够进行连接。 - Kimble
@Kimble:当然取决于具体应用,但是在连接表过多的情况下,你会在哪里划线认为已经“连接过多”了呢? - Industrial
1
@工业界:我认为这个问题没有一个确切的答案。它很大程度上取决于连接中包含的表中的数据量。Digg.com已经发布了许多关于他们在这个领域的经验的文章/博客条目。 - Kimble
@Kimble 谢谢!我会去看看他们的博客以获取更多信息。如果你有任何特定的文章,请告诉我! - Industrial

1

通常来说,这要看你的应用程序,但过度反规范化可能会在以后带来麻烦。规范化良好的数据库意味着您应该能够以后可能需要的大多数方式查询数据,特别是对于报告(通常是后期想起来的)。

如果您将所有数据都放在序列化文本列中,并且您的客户要求显示具有特定属性的所有行的报告,则必须执行一些字符串操作才能获取此数据。

如果您担心查询过多的连接,可以考虑将某些数据集公开为视图...


1

如果您确保索引了外键(您设置了外键,对吧?)并在查询中有适当的where子句,那么数据库应该可以轻松处理10-15个连接。特别是对于如此少的行数。我有一些查询涉及到数百万行的表格,但它们运行得很好。

通常情况下,最好对数据进行分区而不是去规范化。

至于去规范化,除非您还制定了一种策略来使规范化的数据与父表同步,否则不要这样做。

至于您是否真的需要那么多表格或者您的设计是否不好,唯一能够评论的方式就是看到表格结构。


0

除非你有明确的证据表明连接操作影响了性能,否则保持规范化。否则,就像其他人所说的那样,你将不得不担心多次更新。

特别是如果数据库被大量缓存,正如你所说的那样,你会惊讶于DBMS在执行这种操作时的速度有多快 - 毕竟这就是它的设计目的。

除非它是那种需要特殊性能优化的大型应用程序,具有大量数据,否则保持开发、测试和后期维护的努力更为重要。

连接通常是好的,而不是坏的。它们允许你将数据放在应该放置的位置,从而给你最大的灵活性。

正如已经说过很多次的那样,过早地进行优化通常是不好的,而不是好的。


好的,我们并不是在建造新的“面管”(Facetube),但我们真的不想从一开始就构建一个结构糟糕的应用程序。您对何时合并表格并将它们彼此分离的看法是什么? - Industrial
@工业界 - 通常情况下,反规范化的时机是当您有明确的需要证据时。除此之外,“从一开始就不良结构”的问题更可能是由于试图猜测您在优化方面比DBMS更强而产生的。 - ChrisA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接