0

我目前有以下 PostgreSQL 数据库(图片仅包含基本组件): DBVis 图像

基本上:每个 TX 都有一些 TXIN 和一些 TXOUT,每个 TXIN 由一个 TXOUT 环(门罗币交易)组成

如果我将ring表与txin我使用的表连接起来select * from ring natural join txin,它inid用于连接。和相同ringtxout除了它加入outid.

两者txintxout也可以通过自然连接进行连接tx以获得合理的输出。

唯一(预期)不起作用的是:

select * from txout natural join ring natural join txin;

因为它然后加入ring(inid) = txin(inid)ring(outid) = txout(outid)(这是需要的)但也是txin(txid) = txout(txid)不希望的。

我有一些想法如何解决这个问题:

  1. 使用显式连接(在我看来使一些查询非常麻烦),例如上面的内容是: select * from txout join ring using (outid) join txin using (inid);

  2. 重命名 txin 或 txout 中的两个 txid 列之一,并放弃与 tx 的自然连接

  3. 使用忽略这些操作的 txid 的 txin/txout 视图

还有另一种(更好的)方法吗?如果不是 - 哪种方法是最佳实践?我的数据库设计是否缺乏,整个问题可以以某种方式规避?

4

2 回答 2

2

自然连接被明确定义为连接所有具有相同名称的列。就是这样,它实际上与 (如果此语法有效) 相同JOIN table USING (*)冗长的 SQL 没有任何问题。非常清楚您的连接条件会更好且更易于维护,这意味着如果您将来向这些表添加一列,它不会与历史数据混淆。在这种情况下,我建议使用显式语法加入,因为这清楚地表明了数据的来源:

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

在这里要清楚。自然连接不是一个可维护的解决方案,它们非常适合在紧要关头将视图组合在一起,但模式会发生变化,如果您使用自然连接而不是显式连接,那么当它们这样做时会遇到问题。

我不确定你为什么要设计你的数据库,看起来数据有故意重叠,可以放在一个表中,(txid, inid, outid, txhash)但也许我缺乏完整的上下文。

于 2018-04-05T09:55:12.600 回答
0

我会推荐简化的 Oracle 语法:

SELECT * 
  FROM ring
  JOIN txout USING(outid)
  JOIN txin  USING(inid)
于 2018-07-04T06:19:00.517 回答