SQL模式和查询可以有效地从列的排列中进行选择

时间:2015-10-14 15:13:50

标签: database postgresql database-design database-schema

我正在使用postgresql 9.3 +

我正在设计一个DB来描述一群人的统计数据。 想象一下,你有150名球员可以选择,球队有5名球员和每个可能的球队组合的数据(每场比赛的得分数,比赛长度等等)。每个队员都可以有不同的位置(如控球后卫,得分后卫,小前锋等)。

目前它只包含一个看起来像这样的表

(p为播放器的ID,R为角色)

-------------------------------------------------------------------------------
  id       |  p1 | r1 | p2 | r2 | p3 | r3 | p4 | r4 | p5 | r5 | data collumns |
-------------------------------------------------------------------------------
1A2C5A8D9B |  1  |  A |  2 |  C | 5  | A  | 8  | D  | 9  | B  | ............. |

px已排序,可以有~150个值(不连续)

p1 < p2 < p3 < p4

rx是4个可能值的枚举,

id是通过连接pxrx for x in 0..5获得的,它是一个字符串,是唯一键。

执行最多的查询将是:

  • find all the rows which have (34, A), (411, D), (233, A)

    我能想到的唯一方法是

    SELECT * FROM table WHERE id like '%34A%233A%411D%'

  • sum the data of all the rows which have (34, A), (411, D), (233, A)

    我可以这样做  SELECT SUM(data1), SUM(data2) FROM ...;

  • find which are the missing px which maximize a given data column

    我可以通过

    来做到这一点

    SELECT * FROM ... ORDER BY data LIMIT 1

    但我没办法find the px which has rx=ROLE which maximizes data

  • find avg performances of the team on data for the different roles of p=34

    要做到这一点,我需要将rx分组给定px = 34(但在某些行中p1 = 34,在其他行p4 = 34),并找到每组的平均数据。

在80000行上,第一个查询在我的机器上占用40ms,并使用顺序扫描执行(与所有其他查询一样)。 扫描产生很少的匹配(大约100秒)。 所以我无法利用索引和提供所有信息的附加列。 行将增长至少10倍,因此执行时间约为400毫秒肯定是一个问题。

我将与Django ORM的数据库进行交互。

1)如何修改表模式设计,以便我编写的所有查询都可以在Django中轻松表达并更快地执行(利用索引)? 我正在使用python生成的数据填充数据库,因此我可以在将数据放入数据库之前对数据执行操作

2)如果那里没有更智能的架构,我怎么能写出最后一个我目前无法写的查询?

此外,您将如何设计索引?

0 个答案:

没有答案