使用PostgreSQL,我有一个与自身有多对多关系的表。该表名为tools
,我正在使用名为integrations
的辅助表执行多对多,其中包含两个字段tool_a_id
和tool_b_id
。
有更好的方法吗?这样做的问题是,无论何时我想查找所有集成,我都需要检查tool_a
和tool_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困住。
答案 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 标记为列表,我将从中选择我想要的一个工具知道哪些是与之相融合的。