2

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

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

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

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

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

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

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

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

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

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

4

3 回答 3

3

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

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

于 2011-04-23T14:59:38.050 回答
2

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

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

于 2011-04-23T14:57:24.307 回答
0

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

In the last Fortune 500 I worked at, programs written in at least 25 different languages hit our operational database. (From 'a' to 't', assembler to TCL. I don't recall any languages that started with the letters u through z, but there could have been some.) Some of those programs had their first release in the early 1970s.

于 2011-04-23T15:11:36.140 回答