我有一个关于数据库设计的问题,我正在使用 Hibernate for ORM 使用 PostgreSQL,我继承的设计包括下表
用户
user_id (pk) user_name user_dob ...
会话
session_id (pk) session_date session_duration ...
用户会话
user_id (fk) session_id (fk)
您可以猜到一个用户可以有多个会话,使用连接表的原因(我相信)是因为可以在用户存在之前添加一个会话(并且它在用户注册后链接到用户),从而避免了可为空会话表中的字段...很好。
但我最近一直在考虑创建一些多列索引以加快某些查询的速度,并且意识到我不能将用户包含在该索引中,因为该列位于不同的表中。
由于我对数据库设计还很陌生,所以我想知道上面的设计是否正确?还是我实际上最好在会话表中使用可为空的 FK 以允许我索引用户关系?
如果一个会话在任何给定时间只能属于一个用户,则更合适的模型将是没有连接表 (
user_sessions
)。columnuser_id
being有什么问题NULL
?如果你需要它
NOT NULL
并且你在创建时并不总是知道用户,只需插入一个用户“未知”(user_id 0
在我的例子中)。也可以作为DEFAULT
价值...索引策略注意事项
Postgres 可以以极快的速度组合多个索引。通常,在您的原始场景中,有一个嵌套循环:
说,你有这些指数:
两者都应自动包含在原始模型中的 pk 约束中。然而,第二个可能是任何一种方式
(user_id, session_id)
,(session_id, user_id)
这很重要:复合索引是否也适用于第一个字段的查询?
为了在查询中获得最佳性能,例如:
您需要索引(或 pk 约束)是
或者有一个附加索引
user_id
作为第一列。