为简单起见,接线表中有额外的user_id



我有 3 个表:

foo(id, ..., user_id)
bar(id, ...)
foo_bar(foo_id, bar_id)

我需要从"foo_bar"中选择一行并检查该记录是否属于特定用户。将"user_id"列添加到"foo_bar"表以便我可以运行查询是否很好:

// 1 query only 
$foobar = SELECT * FROM foo_bar WHERE foo_id = ? AND bar_id = ? AND user_id = ?

而不是先查询"foo"表以检查"foo"记录是否属于用户,然后运行第二个查询以选择"foo_bar"记录? 像这样:

// 2 queries
$userId = SELECT user_id FROM foo WHERE foo_id = ?;
if ($userId === $userIdToCompareTo) {
$foobar = SELECT * FROM foo_bar WHERE foo_id = ? AND bar_id = ?
}

这是否有意义,或者这通常以更复杂的查询以另一种方式处理?

不,你不应该。 您应该使用以下join查找该值:

select . . . 
from foo_bar fb join
foo f
on fb.foo_id = f.id
where f.user_id = ?;

数据建模的一个关键原则是,您应该只在一个地方存储数据。 也就是说,如果您将user_id存储在foo_bar中,那么如果user_id发生变化会发生什么? 或者,如果删除foo记录?

在某些情况下,您可能需要复制用户 ID。 特别是,如果用户 ID确实发生更改,您可能希望在创建记录时捕获foo_bar上的user_id。 我之所以提出这一点,只是因为理解原则并了解它们何时不一定适用很重要。

最新更新