【问题标题】:Efficient Query for Extended Details off an Association Object Pattern关联对象模式扩展详细信息的高效查询
【发布时间】:2010-11-25 20:39:38
【问题描述】:
详情
- 一个
Person 有很多Objectives。
-
Objectives 有 Person-有关 Activitys 的具体详细信息。
-
Activity 包含通用信息,例如世界纪录。
-
Person 可以组织一个Event 来尝试Objective。
-
Person 邀请其他Persons 观看Event 和Invitation。
架构
注意:示例模式图中仅列出了反向引用,用“(fk)”表示。箭头表示正常关系。
Image Link Until I Get 10 Points To Use Image Tag
问题
我希望收到所有Invitations 一个Person 的大多数Event、Objective 和Activity 详细信息(无论状态,但状态 em> 仍然需要)立即显示。
在我尝试处理这样的 JOIN 之前,是否有更好的方法来表示问题?我相信 Person -> Invitation Event 是一个 Association Object 模式,但我不确定如何干净地获取 Objective 和 Activity 信息,每个Invitation返回的有效方式。
奖励:提供示例 SQLAlchemy 查询。
【问题讨论】:
标签:
database
database-design
sqlalchemy
declarative
【解决方案1】:
在 SQL 方面,这非常简单。我建立了一些表进行测试,只使用一个 id 号(对于人);其余的键都是自然键。查看此查询的执行计划
select I.*, A.activity_placeholder, E.event_location, O.objective_placeholder
from event_invitations I
inner join activity A
on (I.activity_name = A.activity_name)
inner join events E
on (I.personal_id = E.personal_id
and I.activity_name = E.activity_name
and I.objective_deadline = E.objective_deadline
and I.event_time = E.event_time)
inner join personal_objectives O
on (I.personal_id = O.personal_id
and I.activity_name = O.activity_name
and I.objective_deadline = O.objective_deadline)
where I.person_invited_id = 2;
显示 dbms (PostgreSQL) 一直在使用索引,除了对 event_invitations 的顺序扫描。我确定那是因为我使用的数据很少,所以所有这些表都可以轻松放入 RAM。 (当表适合 RAM 时,扫描小表通常比使用索引更快。)
优化器估计查询的每个部分的成本为 0.00,而且没有比这更好的了。实际运行时间不到 0.2 毫秒,但这并不意味着太多。
我相信你可以把它翻译成 SQLAlchemy。如果您希望我发布我的表格和示例数据,请告诉我。