数据库效率:从表到表的引用/指针

时间:2013-04-14 13:32:13

标签: performance database-design

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

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

我认为在这样的情况下,在字段中存储单个或一个引用/指针列表的能力会消耗大量的搜索查询和存储要求。

这是一个简单的疼痛布局的链接,我用它来说明这一点: Image(表条目可能有一些命令字符,如'|',之后它知道以下条目是一个文件目录,所以当数据库启动时它知道在那里做一个指针)

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

1 个答案:

答案 0 :(得分:0)

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

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

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


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

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

3 显然必须是非NULL。假设属性(或其组合)是“非NULL且唯一”,则将其称为“密钥”是同义词。理想情况下,密钥也应该是不可变的(因此不需要级联引用操作,例如ON UPDATE CASCADE)。