【问题标题】:Why isn't a database considered a form of global state?为什么数据库不被视为一种全局状态?
【发布时间】:2011-04-23 14:50:42
【问题描述】:

我对这种差异有一种普遍的直觉,但我无法准确指出是什么使数据库与全局状态不同。

对于“全局状态”的简单定义,数据库通常至少是应用程序全局的。您可以想象有一个应用程序可以在执行过程中更改数据库,但在一般情况下,它是全局使用的。

关于状态,我认为我不需要争论数据库包含状态的情况。

那么是什么让数据库不同于“坏”的全局状态呢?

提出这个问题是因为我试图避免紧耦合对象需要了解其父对象。

例如,假设您正在玩一款策略游戏,并且您的一个单位有能力说,当它对敌方单位造成伤害时,该单位的所有者会损失 x 金币,其中 x 是造成的伤害量。

嗯,在正常情况下,一个单元不应该知道它的所有者是谁。所有者是控制单元的人,因此所有者只需向单元发出命令,它就会做它的事情。

但是由于外部因素,需要找出单位的所有者是谁。在这种情况下,攻击单位知道它正在攻击的单位,这很好。但是现在除了知道它正在攻击的单位之外,它还必须进一步知道它的所有者才能使所有者损失 5 金币。

我已经偏离了最初的问题,超出了我的预期,但如果游戏状态存储在关系数据库中,那么在没有单位需要直接知道他们是谁的情况下查询目标所有者将是微不足道的所有者是。如果这样的数据库是一个对象,我会称该数据库为上帝对象,因为它知道所有事物的整个状态,而且是可变的。

那么,是什么让数据库不同于全局状态?

【问题讨论】:

    标签: database decoupling global-state


    【解决方案1】:

    它的不同之处在于它被设计为共享的全局状态资源。

    RDBMS 实现了ACID,而其他大多数全局状态都没有。

    【讨论】:

    • 啊有趣。那么,您是否会声称缺乏 ACID 合规性是大多数全球州的问题?还是说的太强了?
    • @Davy8 - 这个声明太强了。大多数全局状态的问题在于它没有得到妥善管理。
    【解决方案2】:

    您同样可以问:“为什么操作系统不被视为一种全局状态?”我想这取决于您要如何看待它。但谁在乎?导致这么多问题的不是那种全局状态,即库代码中的全局变量。数据库和操作系统都为各种各样的程序提供了支持技术——它们已经证明了它们的价值。这并不是说两者都没有问题:数据库会使单元测试变得更加困难(提示:尝试模拟),并且各种各样的操作系统可能会导致难以制作每个人都可以使用的程序。

    另一种看待它的方式:在大多数代码中都有全局状态的有效替代方案,而使用数据库的替代方案通常是在您自己的代码中有效地实现数据库(无论您是否称其为数据库) .

    【讨论】:

    • 我是否正确解释为“是的,它是全局状态,但它是一种经过严格审查的形式,它解决的问题比它创造的问题多”?
    • 我想,这取决于观众和你的目的。
    【解决方案3】:

    一个 dbms 管理多个应用程序的并发访问、安全性、数据完整性以及逻辑和物理数据独立性,而不管它们的编程语言是什么,其中大部分对于单个程序员来说可能是未知的。它通常以简单的声明方式完成所有这些工作,而不是以程序方式。

    在我工作的上一期财富 500 强企业中,使用至少 25 种不同语言编写的程序进入了我们的运营数据库。 (从 'a' 到 't',从汇编器到 TCL。我不记得有任何以字母 uz 开头的语言,但可能有一些.) 其中一些程序在 1970 年代初首次发布。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 2013-01-09
      • 2012-05-18
      相关资源
      最近更新 更多