是'黑洞'表恶吗?

时间:2011-10-13 15:32:34

标签: mysql database postgresql database-design

阅读this question我刚刚学会了blackhole表技巧的存在:基本上是使用单个表来插入数据,然后是在许多其他表中分割数据的触发器

我想知道这是否会导致问题,一旦开发项目的开发人员意识到这一点。

tecnique 的优缺点是什么?

修改: 当我看到这个例子时,我想到的眨眼是关于交易:如果由于某种原因交易失败,你会找到带有原始数据的blackhole行,用于历史目的,也许是调试帮助 - 但这似乎是我能看到的唯一+1黑洞。想法?

8 个答案:

答案 0 :(得分:18)

我认为黑洞没有任何真正的优点。

编写触发器代码来移动数据可能并不比编写代码以便首先在正确的位置插入数据的工作少得多。

Christian Oudard写道,它并没有降低复杂性 - 只是把它移到一个很难调试的地方。

缺点:

“副作用”在软件开发中通常是一个坏主意。触发器是副作用 - 我打算做一件事(在表中插入数据),它实际上做了很多其他事情。现在,当我调试我的代码时,我必须将所有副作用保留在我的脑海中 - 副作用本身也会产生副作用。

大多数软件在维护方面花费的时间远远多于开发时间。将新开发人员带入团队并解释黑洞技巧可能会增加学习曲线 - 可以忽略不计的好处(在我看来)。

因为触发器是副作用,如果你不小心,引发大量触发器相对容易,我总是试图设计我的数据库而不依赖于触发器;触发器显然是正确的方法,我只让我最有经验的开发人员创建它们。黑洞技巧使触发器成为正常,规则的工作方式。当然,这是个人观点。

答案 1 :(得分:15)

提示你的original question并没有成为MySQL“黑洞”的核心。

什么是BLACKHOLE?

在MySQL中,BLACKHOLE是一个storage engine,它只是丢弃所有插入其中的数据,类似于空设备。使用这个后端有很多原因,但它们往往有点深奥:

  • “仅限中继”的binlog过滤从站
    请参阅docsherehere
  • 基准测试例如,测量二进制日志记录的开销而不用担心存储引擎开销
  • 各种计算技巧
    here

如果您不知道为什么需要伪装成表格的数据接收器,请不要使用它。

您要问的技术是什么?

use under consideration似乎是:

  1. 将INSERTed数据重定向到其他表
  2. 审核记录原始的INSERTion操作
  3. 丢弃原始的INSERT数据
  4. 因此,“邪恶”或优点/缺点问题的答案与可插入/可更新VIEW(实现#1的常用方法)的问题的答案相同,基于触发器的审计日志记录(大多数人如何通常做#2)和行为改写/反击(有很多方法可以完成#3)。

    那么,答案是什么?

    答案当然是“有时候这些技巧是合适的,有时候也不合适。” :)你知道你为什么这么做吗?应用程序是否更适合此功能?抽象是否过于脆弱,过于漏洞,过于僵化等等?

答案 2 :(得分:4)

这看起来不是一个好主意。如果您试图保持前端代码简单,为什么不只是使用存储过程?如果不是保持前端代码简单,我根本不明白这一点。

答案 3 :(得分:3)

有趣的是,我今天也了解到了黑洞的存在。

可以说这里的问题实际上是一个更广泛的问题,即业务逻辑是否应嵌入数据库触发器中。在这种情况下,黑洞表基本上被用作黑洞表上的触发器可以使用的瞬态数据存储。触发器应该首先使用吗?对我而言,这是问题的真正含义。

我个人认为触发器的使用应仅限于日志记录和DBA特定任务,并且不应包含应该完全属于应用程序层的业务逻辑(或任何逻辑)。看来似乎有很多关于database triggers are evil or not的意见。我认为你的问题也属于那个类别。

在数据库触发器中嵌入应用程序层逻辑可能存在风险。

最终可能会在应用程序之间拆分业务逻辑 代码和数据库。这确实非常令人困惑 有人试图支持并进入代码库。

如果您在触发器和存储过程中的逻辑过多,您可以轻松地在数据库服务器上遇到性能问题,这些问题可能已经通过分发重型处理任务(即复杂的业务)来解决应用程序服务器之间的逻辑,使数据库服务器的主要用途是服务数据。

当然,我的两位是值得的!

答案 4 :(得分:2)

每次在表中插入一行时,可能是你写到硬盘驱动器的同一区域或同一页面(在MS-SQL世界中,我不知道postgresql),所以这个技术可能会导致争用和锁定,因为所有事务现在都在竞争写入同一个表。

此外,这会使插入性能减半,因为插入需要两个插入而不是一个。

这是非规范化,因为现在有两个数据副本而不是一个。

答案 5 :(得分:1)

请不要这样做。这不会降低复杂性,只会移动它。这种逻辑属于应用程序层,您可以使用PHP,Python或Ruby等更好的语言来实现它。

答案 6 :(得分:1)

不要这样做。事实上它被称为技巧而不是标准的做事方式对我来说足够了。

这完全杀死了关系模型的正常使用模式。不确定它是否真的杀死了正常的形式,因为你仍然可以拥有一切。它只是搞乱了数据进入目标表的方式。在维护噩梦之上看起来像是一场表演噩梦。想象一下,有一个触发器必须触发1,800多个表插入的触发器。这让我感到恶心。

这不过是一个有趣的客厅技巧。

答案 7 :(得分:0)

我认为这样会很慢,因为不能使用“批量插入”的优点。