我是数据库新手,这个问题与我对数据库的期望有多大关系。这里的“数据库”我的意思是“类似”MySQL或H2(我实际上不知道这两个是否相似,只是它们很受欢迎)。我实际上正在使用ScalaQuery,因此它从底层数据库中抽象出来。
假设我有一个包含类型(String,Int)的条目的表,在String条目中有很多冗余。所以我的表可能看起来像:
(亚当,18岁) (亚当,24岁) (亚当,34岁) ... 继续 ... (亚当,3492) (Bethany,4) (Bethany,45岁) ... 继续 ... (Bethany,2842)
如果我用H2存储这个表,它是否足够智能以实现“Adam”和“Bethany”重复多次,并且可以用指向查找表的枚举替换?还是会浪费大量存储?
相关:如果H2在这方面很聪明,那么双打是否同样聪明?在我可能是脑死亡的初始表中,我碰巧有很多重复的双重字段。
谢谢!
答案 0 :(得分:6)
数据库引擎不是为了识别数据中的冗余并修复它们而构建的。这是设计人员/开发人员的任务。
答案 1 :(得分:2)
数据库旨在存储信息。数据库无法知道(Adam,44)和(Adam,55)是否可以被压缩,如果数据库试图像您提议的那样做,我会被吓呆,因为这会导致各种性能和/或逻辑问题。
相反,数据库不会最小化存储,它们会添加冗余信息,如索引和密钥,以及DB所需的其他内部附加信息。
构建数据库是为了快速检索信息,而不是有效地存储空间。当涉及复杂性时,数据库会增加存储空间,然后降低查询的性能。
答案 2 :(得分:1)
有些存储系统压缩页面,所以问题是有效的。我不能谈论MySQL,但我相信它与H2类似。 H2在这方面不是很聪明。 H2确实压缩数据,但仅适用于以下情况:
此外,H2使用类似于UTF-8的编码来存储文本,但我不会称之为压缩。
答案 3 :(得分:0)
基于连续存储的MySQL和其他SQL产品在这种情况下并不聪明。
考虑两个逻辑集,一个引用另一个(即外键)。一种可能的实现是物理地存储两个集合共同的值,并且对于两个表来存储指向该值的指针(想想3GL编程语言中的引用类型变量,例如C#)。但是,大多数SQL产品都将值存储在两个表中;如果你想要指针,那么最终用户必须自己实现它们,通常使用autoincrement整数'surrogate'键,这很可能会暴露在逻辑模型中。
答案 4 :(得分:0)
您要么在谈论数据压缩,这可以由数据库引擎完成,而不应该是您关注的问题。 或者你在谈论数据规范化。那么你应该阅读数据库设计。
数据库用于存储数据,因此无需担心一些冗余。如果您要进入数百万行和千兆字节的数据,那么您可以开始考虑选项。但是达到这个水平,你就不会有任何性能问题。