发布
社区首页 >问答首页 >构造数据库

构造数据库
EN

Stack Overflow用户
提问于 2013-11-05 23:35:30
回答 1查看 89关注 0票数 2

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

  • 锦标赛
  • 比赛参与者(Tpart)
    • 将用户与锦标赛相关联

  • 圆角

代码语言:javascript
代码运行次数:0
复制
- This is a single match 

  • 空穴
    • 将某一环节与一轮
    • 也有一个分数

这是我目前的持久性实体:

代码语言:javascript
代码运行次数:0
复制
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相关的所有洞的得分相加。 第1轮第2轮..。p1 / 56 / 54 p2 / 60 / 57
  • 所有与roundPart的孔1孔2孔有关的孔和零件.p1

要获得第一个表上的数据,需要对每个用户的所有洞分数进行求和。这是一个有效的方法吗?还是最好有另一个实体RndScore,如下所示:

代码语言:javascript
代码运行次数:0
复制
RndScore
  rnd RoundId
  tpart TpartId
  score Int

每次更新洞实体时,都可以更新该实体。不过,这两种解决方案似乎都相当有力。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-06 12:16:07

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

通常,您应该避免预成熟的优化:确保实际需要优化数据库布局(例如,通过测量运行时、检查查询执行计划、估计必须回答的查询数量等)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19801255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档