Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
像MySQL和H2这样的数据库在最小化冗余方面有多聪明?_Mysql_Sql_Database_H2_Scalaquery - Fatal编程技术网

像MySQL和H2这样的数据库在最小化冗余方面有多聪明?

像MySQL和H2这样的数据库在最小化冗余方面有多聪明?,mysql,sql,database,h2,scalaquery,Mysql,Sql,Database,H2,Scalaquery,我是数据库新手,这个问题与我对数据库的期望有多高有关。这里所说的“数据库”是指“类似”MySQL或H2(我实际上不知道这两者是否相似,只是它们很流行)。我实际上使用的是ScalaQuery,因此它从底层数据库中抽象出来 假设我有一个表,表中的条目类型为(String,Int),字符串条目中有大量冗余。所以我的桌子可能看起来像: (亚当,18岁) (亚当,24岁) (亚当,34岁) ... 继续的。。。 (亚当,3492) (贝瑟尼,4) (贝瑟尼,45岁) ... 继续的。。。 (贝瑟尼,284

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

假设我有一个表,表中的条目类型为(String,Int),字符串条目中有大量冗余。所以我的桌子可能看起来像:

(亚当,18岁) (亚当,24岁) (亚当,34岁) ... 继续的。。。 (亚当,3492) (贝瑟尼,4) (贝瑟尼,45岁) ... 继续的。。。 (贝瑟尼,2842)

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

相关:如果H2在这方面对字符串是智能的,那么它对双精度也是智能的吗?在我可能已经脑死亡的初始表中,我碰巧有很多重复的双字段


谢谢

数据库引擎不是用来识别数据中的冗余并修复它们的。这是设计人员/开发人员的任务。

数据库设计用于存储信息。数据库无法知道(Adam,44)和(Adam,55)是否可以被压缩,如果数据库尝试像您建议的那样做,我会被吓呆,因为这可能会导致各种性能和/或逻辑问题

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


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

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

  • ,如果启用
  • 以下情况不会影响已关闭数据库的存储大小:H2在当前使用写入时会压缩撤消日志,因此页面中的重复数据将略微提高写入性能(但仅在检查点之后)。然而,这在未来可能会改变

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

MySQL和其他基于连续存储的SQL产品在这方面根本不聪明


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

或者您所说的是数据压缩,它可以由数据库引擎完成,不应该引起您的关注。 或者您正在谈论数据规范化。然后,您应该仔细阅读数据库设计


数据库是用来存储数据的,所以不需要担心一点冗余。如果您要处理数百万行和千兆字节的数据,那么您可以开始考虑各种选项。但是达到这个级别后,您的性能不会有任何问题。

谢谢。数据库引擎通常提供哪些服务?由于从未研究过DBs,我假设使用某种缓存和某种交叉索引。这些假设有效吗?还有什么东西是用数据库买来的吗?@emchristiansen我想是时候给自己买一本关于数据库的书,真正研究数据库了。你可以写一本书来回答你的问题。