PostgreSQL中有许多与自身的关系

时间:2015-09-30 15:05:05

标签: postgresql many-to-many

使用PostgreSQL,我有一个与自身有多对多关系的表。该表名为tools,我正在使用名为integrations的辅助表执行多对多,其中包含两个字段tool_a_idtool_b_id

有更好的方法吗?这样做的问题是,无论何时我想查找所有集成,我都需要检查tool_atool_b,如:

SELECT * FROM integrations
WHERE tool_a_id = x AND tool_b_id = x

或当我想选择与其他工具集成的所有工具时,我必须这样做:

SELECT "tools".* FROM tools, integrations
WHERE ((tools.id = integrations.tool_a_id AND integrations.tool_b_id = x) 
   OR (tools.id = integrations.tool_b_id AND integrations.tool_a_id = x))

例如,这不允许在Rails中轻松地将集成定义为关系,因为Rails期望只有一个外键匹配。有没有更好的办法?感觉不够优雅。我不介意被PostgreSQL困住。

1 个答案:

答案 0 :(得分:1)

嗯,这就是我们从RDBMS书籍中学到的方式。 ;)

但是在您的SQL示例中,您没有正确定义对象。我认为你可能正在寻找的是更像这样的东西(使用相同的数据库模式):

listView = new MainCurrencyListView(getContext());


adapter = new ItemListAdapter(getContext(), items);

SimpleSwipeUndoAdapter simpleSwipeUndoAdapter = new SimpleSwipeUndoAdapter(adapter, getContext(), new SwipeOnDismissCallback(adapter));
AlphaInAnimationAdapter animAdapter = new AlphaInAnimationAdapter(simpleSwipeUndoAdapter);
animAdapter.setAbsListView(listView);
assert animAdapter.getViewAnimator() != null;
animAdapter.getViewAnimator().setInitialDelayMillis(INITIAL_DELAY_MILLIS);
listView.setAdapter(animAdapter);

//DragAndDrop
listView.enableDragAndDrop();
listView.setOnItemMovedListener(new ListItemMovedListener(adapter));
listView.setOnItemLongClickListener(new ListItemLongClickListener(listView));

/* Enable swipe to dismiss */
listView.enableSimpleSwipeUndo();

这更优雅,因为它将 t1 标记为要选择的工具列表,将 t2 标记为列表,我将从中选择我想要的一个工具知道哪些是与之相融合的。