SQL和在多个表上存储外键,而不是通过表连接以进行查询

SQL和在多个表上存储外键,而不是通过表连接以进行查询,sql,join,foreign-keys,Sql,Join,Foreign Keys,查询多个表和外键的最佳实践是什么 例如: 用户有很多任务,有很多提醒 我认为最好的做法是将外键留给他们的直系亲属,即: 任务表: 用户识别码 提醒表: 任务id …以避免出现一组外键将表连接到所有可能的亲属的情况 假设我想检索用户的所有提醒 SELECT reminders.* FROM users LEFT JOIN tasks ON users.id = tasks.user_id LEFT JOIN reminders ON tasks.id = reminders.task_id WHE

查询多个表和外键的最佳实践是什么

例如:

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

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

任务表: 用户识别码

提醒表: 任务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}
是否存在这样一个点,即执行连接以检索记录超过了数据库的完整性?(假设存储提醒.user\u id一开始是一个糟糕的做法


5个表?10?

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

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


这里有一个很好的阅读主题:

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

实际上,这意味着只存储直接关系的FKey,而不是次要或隐含的FKey信息。出于性能原因,您可能会在某个时候决定尝试“短路”一种关系,但从技术上讲,这是一种去规范化的形式。你可以这样做,但你只应该在需要明显的时候这样做,换句话说,适当的规范化应该始终是默认的,其他任何东西都需要显着地证明自己

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