【问题标题】:Efficient Query for Extended Details off an Association Object Pattern关联对象模式扩展详细信息的高效查询
【发布时间】:2010-11-25 20:39:38
【问题描述】:

详情

  1. 一个Person 有很多Objectives。
  2. Objectives 有 Person-有关 Activitys 的具体详细信息。
  3. Activity 包含通用信息,例如世界纪录。
  4. Person 可以组织一个Event 来尝试Objective
  5. Person 邀请其他Persons 观看EventInvitation

架构

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

Image Link Until I Get 10 Points To Use Image Tag

问题

我希望收到所有Invitations 一个Person 的大多数EventObjectiveActivity 详细信息(无论状态,但状态 em> 仍然需要)立即显示。

在我尝试处理这样的 JOIN 之前,是否有更好的方法来表示问题?我相信 Person -> Invitation Event 是一个 Association Object 模式,但我不确定如何干净地获取 ObjectiveActivity 信息,每个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。如果您希望我发布我的表格和示例数据,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 2016-10-19
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多