我目前拥有以下PostgreSQL数据库(图片仅包含基本组件):
sql - 从自然联接中排除列-LMLPHP
基本上:
每个TX都有一些TX和一些txout,每个TXIN包含一个txout环(Monero事务)
如果我将ring表与txin表连接,我将使用select * from ring natural join txin表,它将使用inid进行连接。
ringtxout相同,只是它连接在outid上。
txintxout也可以与自然连接进行连接,以获得合理的输出。
唯一(预期)不起作用的是:

select * from txout natural join ring natural join txin;

因为它随后连接txring(inid) = txin(inid)(这是需要的)但也连接ring(outid) = txout(outid),这不是需要的。
我有几个办法来解决这个问题:
使用显式连接(在我看来有些查询相当麻烦),例如,上面将是:txin(txid) = txout(txid)
重命名TXIN或TXOUT中的两个TXID列中的一个,并放弃与TX的自然连接
使用TXIN/TXOUT视图省略了这些操作的TxID
还有别的(更好的)方法吗?如果没有-哪种方法是最佳实践?
我的数据库设计是否缺乏,整个问题是否可以通过某种方式规避?

最佳答案

自然连接被显式定义为在所有同名列上进行连接。就这样,它实际上与(如果这个语法有效的话)相同。详细的SQL没有什么问题。在连接条件上非常清楚会更好,也更易于维护,这意味着如果以后向这些表中添加一个列,就不会弄乱历史数据。在这种情况下,我建议使用显式语法连接,因为这样可以清楚地知道数据来自何处:

SELECT *
FROM txout to
INNER JOIN ring r ON (to.outid = r.outid)
INNER JOIN txin ti ON (r.inid = ti.inid)

在这里说清楚。自然连接不是一个可维护的解决方案,它们非常适合在紧要关头将视图组合在一起,但是模式会发生变化,如果在显式连接上使用自然连接,则在使用时会遇到问题。
我不太清楚你为什么要这样设计你的数据库,看起来数据有故意的重叠,可以放在JOIN table USING (*)的一个表中,但也许我缺乏完整的上下文。

10-04 10:43