0

我是数据库新手,这个问题与我期望数据库有多聪明有关。这里的“数据库”是指“类似于”MySQL 或 H2(我实际上不知道这两者是否相似,只是它们很流行)。我实际上使用的是 ScalaQuery,所以它从底层数据库中抽象出来。

假设我有一个表,其中包含类型为 (String, Int) 的条目,在 String 条目中有很多冗余。所以我的桌子可能看起来像:

(Adam, 18) (Adam, 24) (Adam, 34) ... 继续 ... (Adam, 3492) (Bethany, 4) (Bethany, 45) ... 继续 ... (Bethany, 2842)

如果我用 H2 存储这个表,它是否会足够聪明地实现“Adam”和“Bethany”重复很多次,并且可以用指向查找表的枚举替换?还是会浪费大量存储空间?

相关:如果 H2 在这方面对字符串很聪明,那么它在双打方面是否也很聪明?在我可能脑死亡的初始表中,我碰巧有很多重复的双字段。

谢谢!

4

5 回答 5

6

数据库引擎不是为了识别数据中的冗余并修复它们而构建的。这是设计者/开发者的任务。

于 2011-08-23T23:57:59.207 回答
2

数据库旨在存储信息。数据库无法知道 (Adam, 44) 和 (Adam,55) 是否可以压缩,如果数据库尝试执行您建议的操作,我会感到震惊,因为这会导致各种性能和/或逻辑问题。

相反,数据库并没有最小化存储,它们正在添加冗余信息,如索引和键,以及数据库所需的其他内部附加信息。

数据库的构建是为了快速检索信息,而不是有效地存储信息。当谈到复杂性时,数据库宁愿增加存储空间,然后降低查询的性能。

于 2011-08-24T00:06:40.040 回答
1

有一些存储系统会压缩页面,所以这个问题是有效的。我不能谈论MySQL,但我相信它类似于H2。H2 在这方面不是很聪明。H2 确实会压缩数据,但仅适用于以下情况:

  • LOB 压缩(如果启用)。
  • 以下不影响已关闭数据库的存储大小: H2 目前使用LZF写入时会压缩 undo log ,因此页面中的重复数据将导致写入性能略有提高(但仅在检查点之后)。然而,这可能会在未来发生变化。

此外,H2 使用类似于 UTF-8 的编码来存储文本,但我不会称之为压缩。

于 2011-08-24T04:19:12.547 回答
0

MySQL 和其他基于连续存储的 SQL 产品在这种事情上根本不聪明。

考虑两个逻辑集,一个引用另一个(即外键)。一种可能的实现方式是将两个集合共有的值物理存储一次,并让两个表都存储一个指向该值的指针(想想 3GL 编程语言中的引用类型变量,例如 C#)。但是,大多数 SQL 产品将值物理存储在两个表中;如果你想要指针,那么最终用户必须自己实现它们,通常使用自动增量整数“代理”键,遗憾的是这些键会暴露在逻辑模型中。

于 2011-08-24T09:04:20.130 回答
0

您正在谈论数据压缩,这可以由数据库引擎完成,您不必担心。或者您正在谈论数据规范化。然后你应该阅读数据库设计。

数据库旨在存储数据,因此无需担心冗余。如果您要处理数百万行和数千兆字节的数据,那么您可以开始考虑选项。但是达到那个水平你不会有任何性能问题。

于 2011-08-24T09:09:52.137 回答