需要有关Top 10数据库设计的帮助

时间:2011-06-21 20:00:15

标签: mysql database database-design

我正在努力想出一个数据库设计来保存正在进行的一些计算的“前10名”结果。基本上,当完成所有内容时,将会有3个“前10名”类别,我很好,所有这些都是单独的表格,但是我需要能够返回并稍后提取有关前十名中的内容的历史数据在某些时候,因此需要一个数据库,虽然平面文件可行,但这有可能保存数年的数据。

现在,已经有一段时间了,因为我已经对数据库做了很多事情,除了有几个简单的表之外,所以我在思考这个设计时遇到了一些问题。如果有人可以帮我设计它,我知道足够的MySQL来完成剩下的工作。

所以,从本质上讲,我需要存储:一组10个名字,每个名字占总分数的百分比,他们在前10名中的排名以及与前10名相关的时间(所以我以后可以查询那个时间)

我认为我需要一个包含11列的Top 10表,一个用于ID,10用于'Names'表的外键,它包含所有使用的名称,PK,Name,%,和排名。这对我来说似乎很笨拙,其他人都有建议吗?

编辑:“前10名”与5分钟间隔的特定数据集相关联,并且每个时间间隔完全独立于之前或将来的时间间隔。

2 个答案:

答案 0 :(得分:2)

我不推荐你的解决方案,因为如果你想问数据库“Joe多久经常进入前10名”,你必须写10个表格的查询

SELECT Date FROM Top10 WHERE FirstPlace = 'joe'
SELECT Date FROM Top10 WHERE SecondPlace = 'joe'
...

相反,排名表如何使用字段:

id
Date
Person
Rank

然后,如果您想要特定日期的前10名列表,则查询为

SELECT * FROM Rankings WHERE Date = ...

如果你想知道别人的历史排名,那么查询就是

SELECT * FROM Rankings WHERE Person = ...

如果您想了解所有历史领导者,那么查询就是

SELECT * FROM Rankings WHERE Rank = 1

这样做的缺点是你可能会意外地让两个不同的人排在第8位,而你的数据库会允许异常。但是我有一个好消息 - 人们可能实际上排在第8位,所以你可能真的想要这样做!

答案 1 :(得分:1)

我认为您的“前10名”是特定时间内的快照数据。您的业​​务逻辑是“每5分钟”,以便时间是表设计的父实体

top_10_history
    th_id - the primary key
    th_time - the time point when taking the snapshot data of "Top 10"
top_10_detail
    td_th_id - the FK to top_10_history
    td_name_id - the FK to name
    td_percentage - the "%"
    td_rank - the rank
  1. 如果可以从“top_10_detail”中的列计算“前10名”的序列,则不需要列来保留序列。否则,您需要一个列来保留序列。
  2. 如果您需要更复杂的查询,例如“过去30天中午12点的前10名”,则使用“日”,“小时”和“分钟”的各个列会更好地了解效果(适当的索引)。