0

我正在学习数据库,并且不确定对我来说似乎没有任何意义的东西。在关系模型中,您可以通过引用进行组合,但始终需要每个表中的全局排序键才能组合此信息。这在大多数情况下显然是必需的,但我觉得在数据库的完美树层次结构中这是低效的。

为了更好地解释这一点,我将使用将产品存储在数据库中的示例。产品有主类和子类,非常清晰。(即牛奶是乳制品的子类别,乳制品是食品的子类别等)

我认为在这种情况下,在字段中存储单个或一系列引用/指向表的引用/指针的能力将消除大量搜索查询和存储需求。

这是我为说明这一点而制作的简单痛苦布局的链接: 图像(表条目可能有一些命令字符,如“|”,之后它知道以下条目是文件目录,因此当数据库启动时,它知道创建一个那里的指针)

由于我现在只学习使用数据库,因此我知道我可能只是缺少有关该主题的一些知识,但是当我尝试使用谷歌搜索此问题时似乎没有找到任何东西。任何解释从哪里开始的帮助或任何确认这可能会提高效率以及我可以在哪里学习如何自己编写这个都会很棒。

4

1 回答 1

1

仅当您要指向的对象具有明确定义的地址且至少与指针本身一样永久时,“指针”的概念才有用。如果地址不那么永久,您最终可能会得到一个“悬空”指针。

数据库中的一行不一定有永久地址。1通过通过逻辑值(而不是物理地址)引用行,即使行物理移动,引用仍然有效。2并且为确保该值准确标识一行,它必须是唯一的。3

至于将值列表(无论是“指针”还是其他任何东西)存储在单个字段中,这违反了原子性原则,因此违反了 1NF。避免违反 1NF 有很好的理由,包括保持参照完整性和利用索引的能力。话虽如此,有些 DBMS 支持单个字段中的数组甚至子表,这在极少数情况下可能很有用。


1例如,只要行没有在磁盘上物理移动,Oracle ROWID 就保持不变,但这可能发生在作为正常数据库操作一部分的许多情况下。因此,除了严格限制数据库的使用方式之外,您不能依赖 ROWID 在引用它的行的生命周期内保持不变(这可能与数据库本身的生命周期一样长)。

2我认为理论上 DBMS 可以跟踪所有指针并在行物理移动时更新它们。但是,我不知道在实践中实际上支持这种“可更新”指针的任何 DBMS,可能是因为所需的底层机制不会比标准的“基于值”引用更有效。

3并且显然必须是非空的。说属性(或其组合)是“非 NULL 且唯一的”,与说它是“键”同义。理想情况下,密钥也应该是不可变的(因此不需要像 ON UPDATE CASCADE 这样的级联引用操作)。

于 2013-04-14T15:17:21.480 回答