Database 有效地从列排列中选择SQL模式和查询

Database 有效地从列排列中选择SQL模式和查询,database,postgresql,database-design,database-schema,Database,Postgresql,Database Design,Database Schema,我正在使用postgresql 9.3+ 我正在设计一个数据库来描述一群人的统计数据。 想象一下,你有150名球员可供挑选,每队5人,以及关于每一个可能的球队组合的数据(每场比赛的点数、比赛长度等)。每个队员可以有不同的位置(如控球后卫、得分后卫、小前锋等) 目前它只包含一个如下所示的表 (p id为玩家id,R为角色) px已排序,可具有约150个值(不连续) p1

我正在使用postgresql 9.3+

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

目前它只包含一个如下所示的表

(p id为玩家id,R为角色)

px已排序,可具有约150个值(不连续)

p1
rx是4个可能值的枚举

id是通过将0..5中x的pxrx连接起来获得的,它是一个字符串,是唯一的键

执行最多的查询将是:

  • 查找具有(34,A)、(411,D)、(233,A)的所有行。

    我唯一能想到的就是

    从id为“%34A%233A%411D%”的表中选择*

  • 对具有(34,A)、(411,D)、(233,A)

    我可以用它来做
    从中选择SUM(数据1)、SUM(数据2)

  • 查找最大化给定数据列的缺失px

    我可以自己做

    从中选择*。。。按数据限制排序1

    但是我没有办法
    找到具有rx=角色的px,它可以最大化数据

  • 根据p=34不同角色的数据查找团队的平均绩效

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

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

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

1) 如何修改表模式设计,使我编写的所有查询在Django中易于表达,执行速度更快(利用索引)? 我用python生成的数据填充数据库,这样我可以在将数据放入数据库之前对数据执行操作

2) 如果不存在更智能的模式,我如何编写我目前无法编写的最后一个查询


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

(您的{p1,r1}等是一个重复组)您是对的。我可以将它们放在它们自己的表中,并放置外键而不是组。您认为这对解决之前指定的问题有何帮助?我仍然不知道他们处于什么位置
-------------------------------------------------------------------------------
  id       |  p1 | r1 | p2 | r2 | p3 | r3 | p4 | r4 | p5 | r5 | data collumns |
-------------------------------------------------------------------------------
1A2C5A8D9B |  1  |  A |  2 |  C | 5  | A  | 8  | D  | 9  | B  | ............. |
p1 < p2 < p3 < p4