【发布时间】:2018-04-05 09:48:05
【问题描述】:
我目前有以下 PostgreSQL 数据库(图片仅包含基本组件):
基本上: 每个 TX 有一定数量的 TXIN 和一定数量的 TXOUT,每个 TXIN 由一个 TXOUT 环(门罗币交易)组成
如果我将ring 表与txin 表连接起来,我使用select * from ring natural join txin,它使用inid 进行连接。
ring 和 txout 相同,但它加入 outid。
txin 和 txout 也可以通过自然连接 tx 进行连接以获得合理的输出。
唯一(预期)不起作用的是:
select * from txout natural join ring natural join txin;
因为它随后加入了ring(inid) = txin(inid) 和ring(outid) = txout(outid)(这是需要的),但也加入了不希望的txin(txid) = txout(txid)。
我对如何解决这个问题有一些想法:
使用显式连接(在我看来使某些查询非常麻烦),例如以上将是:
select * from txout join ring using (outid) join txin using (inid);重命名 txin 或 txout 中的两个 txid 列之一,并放弃与 tx 的自然连接
为这些操作使用省略 txid 的 txin/txout 视图
还有其他(更好的)方法吗?如果不是 - 哪种方法是最佳实践? 我的数据库设计是否缺乏,整个问题可以通过某种方式规避?
【问题讨论】:
-
帮自己一个忙,忘记
natural join构造。指定连接列! -
这是自然连接的不良副作用,当您的表中有一些 DATE 列时可能会发生很多情况。我永远不会使用它...
-
@dnoeth 这个想法是您的数据元素名称应该在整个架构中保持一致和唯一,而不是依赖表名来提供上下文。至于您给出的示例,我已经看到设计人员在同一个表中混合了审计数据(例如行创建日期)和“实体”数据,而不是有单独的审计表。将这些修复应用于损坏的架构,
NATURAL JOIN更易于使用。
标签: sql postgresql join natural-join