关于您的问题的几点(即使我担心我并没有真正回答您提出的任何问题),
“一方面,在关系理论中,自然连接是唯一应该发生的连接(或者至少是高度首选的)。”
这似乎表明您将理论解释为好像它禁止“其他类型”的连接......这不是真的。关系理论并没有说“你不能有反连接”,或者“你永远不应该使用反连接”,或者类似的东西。它所说的是,在关系代数中,可以识别一组原始运算符,其中自然连接是唯一的“类连接”运算符。所有其他“类似连接”的运算符,总是可以用定义的原始运算符等价地表示。例如,笛卡尔积是自然连接的特例(其中公共属性集为空),如果您想要两个表的笛卡尔积有一个共同的属性名称,您可以使用 RENAME 来解决这个问题。例如,半连接是第一个表与第二个表的一些投影的自然连接。Antijoin,例如(Date 书中的 SEMIMINUS 或 NOT MATCHING),是第一个表和两者的 SEMIJOIN 之间的关系差异。等等等等
“另一方面,在 SQL 中,建议不要使用 NATURAL JOIN 而是使用替代方法(例如,带限制的内部连接)。”
哪里有这样的建议?在 SQL 标准中?我真的不这么认为。区分由 ISO 标准定义的 SQL 语言本身和由某个特定供应商构建的该语言的某些(/任何)特定实现非常重要。如果 Microsoft 建议其客户不要在 SQL Server 200x 中使用 NJ,那么该建议的含义与有人建议不要在 SQL 中完全使用 NJ 的含义完全不同。
“自然联接在真正的 RDBMS 中工作。然而,SQL 无法完全复制关系模型,并且没有一个流行的 SQL DBMS 是真正的 RDBMS。”
虽然 SQL 本身确实未能忠实地遵守关系理论,但这实际上与 NJ 的问题几乎没有关系。
一个实现是否为调用 NJ 提供了良好的性能,是该实现的一个特征,而不是语言的特征,也不是“RDBMS”中“R”的“真实度”的特征。构建一个不使用 SQL 的 TRDBMS 非常容易,这给 NJ 带来了荒谬的执行时间。SQL 语言本身具有支持 NJ 所需的一切。如果一个实现支持 NJ,那么 NJ也将在该实现中工作。它是否提供了良好的性能,是该实现的一个特征,并且某些特定实现的较差性能不应该被“推断”到其他实现,或者被视为 SQL 语言本身的一个特征。
“好的/更好的表设计应该消除/最小化自然连接产生的问题。”
自然连接产生的问题?通过在所需列上添加显式投影(并在需要时重命名),可以轻松控制出现在连接参数中的列。就像您也想尽可能避免 SELECT * 一样,出于基本相同的原因......