查询多个表和外键的最佳做法是什么?
例如:
用户有很多任务有很多提醒
我认为最好的做法是将外键留给他们的直系亲属,即:
任务表: 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}
执行连接以检索记录是否超过了db的完整性? (假设存储reminders.user_id首先是一个糟糕的实践?
5张桌子? 10?
答案 0 :(得分:2)
标准不是存储不必要的冗余信息,包括可以通过关系/连接派生的冗余外键信息。
实际上,这意味着只存储直接关系'FKeys,而不存储辅助或隐式FKey信息。出于性能原因,您可能在某个时候决定尝试“短路”关系,但从技术上讲,这是一种去标准化的形式。你可以做到这一点,但只有当需要显而易见时, 才能做到这一点,换句话说,正确的规范化应该始终是默认值,其他任何东西都需要明显证明自己。
至于“是否有一个点来进行连接以检索记录超过数据库的完整性?”:可能,但这只能根据具体情况确定。不可能将这样的业务权衡减少到仅数据技术规则。
答案 1 :(得分:1)
您希望在数据库中存储多少数据?如果每个表中的连接数量相对较少,则规范化和非规范化数据库之间的执行时间可以忽略不计。
因此,只需使用对您有意义的设计,您就可以对有意义的表进行规范化和非规范化。
以下是关于这个主题的好读物:http://www.codinghorror.com/blog/2008/07/maybe-normalizing-isnt-normal.html