2

查询多个表和外键的最佳做法是什么?

例如:

用户有很多任务有很多提醒

我认为最佳做法是将外键保留给他们的直系亲属,即:

任务表:id、user_id

提醒表:id、task_id

...以避免您有一堆外键将表连接到所有可能的亲戚的情况。

假设我想检索所有用户的提醒。

SELECT reminders.* FROM users
LEFT JOIN tasks ON users.id = tasks.user_id
LEFT JOIN reminders ON tasks.id = reminders.task_id
WHERE tasks.user_id = {#YourUserIdVariable}

是否存在进行连接以检索记录的重要性超过数据库的完整性?(假设首先存储reminders.user_id 是一个不好的做法?

5张桌子?10?

4

2 回答 2

2

该标准不存储不必要的冗余信息,包括可以通过关系/连接派生的冗余外键信息。

在实践中,这意味着只存储直接​​关系的 FKey,而不是辅助或隐式 FKey 信息。出于性能原因,您可能会在某些时候决定尝试“短路”关系,但从技术上讲,这是一种反规范化的形式。你可以这样做,但只有在需要时才应该这样做,换句话说,适当的规范化应该始终是默认设置,其他任何事情都需要显着证明自己的合理性。

至于“是否存在进行连接以检索记录的重要性超过数据库完整性的点? ”:可能,但这只能根据具体情况确定。不可能将这样的业务权衡减少为仅数据的技术规则。

于 2013-08-27T20:47:00.767 回答
1

您希望在数据库中存储多少数据?如果每个表中用于连接的行数相对较少,则规范化和非规范化数据库之间的执行时间可以忽略不计。

因此,只需使用对您有意义的设计,您就可以在有意义的地方对表格进行规范化和反规范化。

这是关于这个主题的好读物:http: //www.codinghorror.com/blog/2008/07/maybe-normalizing-isnt-normal.html

于 2013-08-27T20:20:19.980 回答