像MySQL和H2这样的数据库在最小化冗余方面有多聪明?
我是数据库新手,这个问题与我对数据库的期望有多高有关。这里所说的“数据库”是指“类似”MySQL或H2(我实际上不知道这两者是否相似,只是它们很流行)。我实际上使用的是ScalaQuery,因此它从底层数据库中抽象出来 假设我有一个表,表中的条目类型为(String,Int),字符串条目中有大量冗余。所以我的桌子可能看起来像: (亚当,18岁) (亚当,24岁) (亚当,34岁) ... 继续的。。。 (亚当,3492) (贝瑟尼,4) (贝瑟尼,45岁) ... 继续的。。。 (贝瑟尼,2842) 如果我用H2存储这个表,它是否足够聪明,能够意识到“Adam”和“Bethany”重复了很多次,并且可以被指向查找表的枚举替换?还是会浪费大量的存储空间 相关:如果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
谢谢 数据库引擎不是用来识别数据中的冗余并修复它们的。这是设计人员/开发人员的任务。数据库设计用于存储信息。数据库无法知道(Adam,44)和(Adam,55)是否可以被压缩,如果数据库尝试像您建议的那样做,我会被吓呆,因为这可能会导致各种性能和/或逻辑问题 相反,数据库并没有最小化存储,而是添加了冗余信息,如索引和键,以及数据库所需的其他内部附加信息
DBs的构建是为了快速检索信息,而不是有效地存储信息空间。说到复杂性,数据库反而会增加存储空间,然后降低查询的性能。有些存储系统会压缩页面,所以这个问题是正确的。我不能谈论MySQL,但我相信它类似于H2。H2在这方面不是很聪明。H2压缩数据,但仅适用于以下情况:
- ,如果启用
- 以下情况不会影响已关闭数据库的存储大小:H2在当前使用写入时会压缩撤消日志,因此页面中的重复数据将略微提高写入性能(但仅在检查点之后)。然而,这在未来可能会改变
此外,H2使用类似于UTF-8的编码来存储文本,但我不会称之为压缩。MySQL和其他基于连续存储的SQL产品在这方面根本不聪明
考虑两个逻辑集,一个引用另一个(即外键)。一种可能的实现是只物理存储两个集合的公共值一次,并为两个表存储指向该值的指针(考虑3GL编程语言(如C#)中的引用类型变量)。但是,大多数SQL产品都在两个表中物理存储值;如果您需要指针,那么最终用户必须自己实现它们,通常使用自动递增整数“代理”键,这会很遗憾地暴露在逻辑模型中。或者您所说的是数据压缩,它可以由数据库引擎完成,不应该引起您的关注。 或者您正在谈论数据规范化。然后,您应该仔细阅读数据库设计
数据库是用来存储数据的,所以不需要担心一点冗余。如果您要处理数百万行和千兆字节的数据,那么您可以开始考虑各种选项。但是达到这个级别后,您的性能不会有任何问题。谢谢。数据库引擎通常提供哪些服务?由于从未研究过DBs,我假设使用某种缓存和某种交叉索引。这些假设有效吗?还有什么东西是用数据库买来的吗?@emchristiansen我想是时候给自己买一本关于数据库的书,真正研究数据库了。你可以写一本书来回答你的问题。