2017-09-25 45 views
1

我试图更好地理解SQL在实践中的工作原理。 它是否将重复记录作为附加参数(表示多重性)存储到记录中?或者,我们是否简单地向表中添加另一个重复记录?或者,还有其他一些方法?我很好奇大多数SQL发行版。SQL实现如何在内部存储重复记录?

例如,假设我们有关系R(A,B,c)与整数属性,我们可以如下存储在内部:

Integer-a Integer-b Integer-c Multiplicity 
1   2   3   2 

备选地

Integer-a Integer-b Integer-c 
1   2   3 
1   2   3 

回答

3

SQL不以重复的方式存储重复的记录(至少没有我熟悉的数据库引擎)。

每条记录​​占据自己的空间。通常,记录与其他记录一起存储在页面上。这些是数据库使用的I/O单元。

这就是说,有一些注意事项。例如,列式数据库独立存储每一行​​。存在压缩技术,其中相邻值将以多重因子存储。这不完全是你的建议,但它是沿着同样的路线。

如果你想了解数据库是如何工作的,我建议你选择一个并研究它。 MySQL有一个非常简单的模型(但是由于存储层与处理层分离的事实而变得复杂)。 Postgres和SQL Server在其页面布局和存储引擎上也有合理的文档。

+0

我很惊讶它的作品是这样的!特别是当有行李如十字路口时。在最坏的情况下,O(m)空间与O(1)空间。 – Daniel

+2

@丹尼尔。 。 。不要认为任何真正的数据库都是关系模型的学术纯粹实现。最好说关系代数启发了SQL。反过来,真实世界的实现受到更多世俗考虑的深刻影响。也许,关系代数是任何给定数据库的DNA,但其实现更多地受到环境因素的影响。 –

+0

还要注意,现在重复数据删除经常发生在文件系统或更低级别 – Gnudiff

1

我不认为SQL引擎使用多重性。这背后的原因是,为了使用多重性(您在问题中定义它的方式),2或多于2行应该是相同的。

现在不会是像Oracle发动机的情况下,因为Oracle隐式添加ID来叫ROW_ID每一行,这将是每行独特的,可以用它来识别整行和它的实际/物理存储位置。至于重复进入列内,我猜测除了列被定义为主键或者列上存在唯一约束之外,不会有列内值的检查/比较(插入数据时)。

希望它有帮助!