【问题标题】:Structuring a database构建数据库
【发布时间】:2013-11-17 01:13:28
【问题描述】:

在我的数据库中,我需要以下关系:

  • 比赛
  • 比赛参与者(Tpart)
    • 将用户与锦标赛相关联
  • 圆形
    • 这是单场比赛
    • 将 Tpart 与一轮相关联
    • 还有一个分数

这是我当前的持久实体:

Tournament
  name Text
  urlName Text
  location GolfCourseId
  startDate Day 
  endDate Day Maybe
  UniqueTName name
  UniqueTUrlName urlName

Tpart
  tournament TournamentId
  userId UserId  
  deriving Show
  deriving Eq

Round
  tourn TournamentId
  name Text
  UniqueRound tourn name
  deriving Show

Hole
  round RoundId
  part TpartId
  score Int 
  deriving Show

考虑到我需要做的查询,我不知道这是否是最好的结构。 我需要

  • 获取每个 Tpart 一轮的总分
    这将通过将与特定回合和 Tpart 相关的所有洞的得分相加来完成

    Part | round 1 | round 2 | ...  
    p1   | 56      | 54  
    p2   | 60      | 57  
    
  • 获取与一轮相关的所有孔和零件

    Part | hole 1 | hole 2| ...  
    p1   | 3      | 5  
    p2   | 5      | 6  
    

要获取第一个表中的数据,需要将每个用户的所有球洞得分相加。这是一种有效的方法吗?还是有另一个实体RndScore 会更好,像这样:

RndScore
  rnd RoundId
  tpart TpartId
  score Int

每次更新孔实体时都可以更新此实体。不过,这些解决方案中的任何一个似乎都相当强大。

【问题讨论】:

    标签: postgresql database-design relational-database yesod


    【解决方案1】:

    我的建议是:您应该始终从干净、规范化的逻辑关系数据库设计开始,而不存储冗余数据,并相信 DBMS 会足够好地导出您的数据(即回答您的查询)。这就是 DBMS 的用途。下一步应该是优化您的物理数据库设计,例如,选择您的索引、您的表存储参数等。根据您的数据库,您甚至可以具体化您的视图,以便存储它们的结果物理等。实际上在逻辑数据库设计中添加派生值(例如您的 RndScore 关系)应该是最后的手段,因为您必须手动确保它们的一致性。

    一般来说,您应该避免过早的优化:确保您确实需要优化您的数据库布局(例如,通过测量运行时间、检查查询执行计划、估计您必须回答的查询数量等) .)

    【讨论】:

    • 非常感谢!通过在psql中使用sum函数,可以得到我想要的结果。
    猜你喜欢
    • 2018-01-02
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 2013-11-13
    相关资源
    最近更新 更多