我正在使用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)如果那里没有更智能的架构,我怎么能写出最后一个我目前无法写的查询?
此外,您将如何设计索引?