阅读这个问题,我刚刚学到了blackhole
表技巧的存在:基本上是使用一个单一的表来插入数据,然后使用触发器将数据拆分成许多其他表。
我在想,一旦正在项目上工作的开发人员知道了这一点,是否会引起问题。
这种技巧的利弊是什么?
编辑:我想到的问题是事务:如果由于某些原因事务失败,您将在blackhole
行中找到原始数据,以便进行历史记录和可能帮助调试 - 但这似乎是我看到黑洞时唯一的优点。有什么想法吗?
阅读这个问题,我刚刚学到了blackhole
表技巧的存在:基本上是使用一个单一的表来插入数据,然后使用触发器将数据拆分成许多其他表。
我在想,一旦正在项目上工作的开发人员知道了这一点,是否会引起问题。
这种技巧的利弊是什么?
编辑:我想到的问题是事务:如果由于某些原因事务失败,您将在blackhole
行中找到原始数据,以便进行历史记录和可能帮助调试 - 但这似乎是我看到黑洞时唯一的优点。有什么想法吗?
我认为黑洞没有任何真正的优点。
编写触发器代码来移动数据的工作量可能与一开始就将数据插入正确位置的代码相比几乎没有差别。
正如Christian Oudard所写,它不会减少复杂性,只是把它移到一个很难调试的地方。
缺点是:
“副作用”通常在软件开发中是个坏主意。触发器就是副作用-我打算做一件事(在表中插入数据),但它实际上会做许多其他事情。现在,当我调试我的代码时,我还必须记住所有的副作用 - 而这些副作用本身可能又有副作用。
大多数软件花费的时间都在维护而不是开发方面。将新的开发人员引入团队并解释黑洞技巧可能会增加学习曲线-对于微不足道的好处(在我的看法中)。
因为触发器是副作用,如果不小心设置,很容易引发大规模触发级联效应,因此我总是尝试设计自己的数据库,而不依赖触发器;在触发器显然是正确的方法时,我只允许最有经验的开发人员创建它们。黑洞技巧将触发器变成一种正常、常规的工作方式。当然,这是个人的观点。
引发你问题的原始问题并没有涉及到MySQL中“黑洞”的本质。
在MySQL中,BLACKHOLE
是一种存储引擎,它会简单地丢弃插入其中的所有数据,类似于一个空设备。使用这种后端的理由有很多,但它们往往有点深奥:
如果您不知道为什么需要一个伪装成表的数据接收器,请不要使用它。
考虑中的用途似乎是:
这似乎不是一个好主意。如果你想让前端代码保持简单,为什么不直接使用存储过程?如果不是为了保持前端代码简单,我根本就不理解它的意义所在。
不要这样做。它被称为技巧而不是标准方法已经足够说明问题了。
这完全破坏了关系模型的正常使用模式。不确定它是否真的破坏了正常形式,因为你仍然可以保持所有的东西。它只是干扰了数据到达目标表的方式。看起来像是性能和维护上的噩梦。例如,想象一张表有一个触发器,必须为1800多个表插入操作触发。这让我感到恶心。
这只是一个有趣的花招,没有其他意义。