0

细节

  1. APerson有很多Objectives。
  2. Objectives 有Person关于 s 的特定细节Activity
  3. AnActivity包含通用信息,例如世界纪录。
  4. APerson可以组织一个Event尝试Objective
  5. APerson邀请其他Persons 与 an 一起观看Eventan Invitation

架构

注意:示例模式图中仅列出了 backref,用“(fk)”表示。箭头表示正常关系。

图片链接,直到我得到 10 分才能使用图片标签

问题

我希望立即显示所有收到的所有s 的大部分EventObjective和详细信息(无论状态如何,但仍需要状态)。ActivityInvitationPerson

在我尝试处理这样的 JOIN 之前,是否有更好的方法来表示问题?我相信Person-> Invitation<-Event是一个关联对象模式,但我不确定如何以干净、有效的方式为每个返回的获取Objective和信息。ActivityInvitation

奖励:提供示例 SQLAlchemy 查询。

4

1 回答 1

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。如果您希望我发布我的表格和示例数据,请告诉我。

于 2011-02-13T14:07:30.407 回答