Jon*_*n H 5 database-design sql-server
问题:为了好玩,我正在建立一个彩票结果数据库,以获取一些统计数据。到目前为止,我只对 Pick 3 风格的乐透感兴趣,以后可能会介绍更多。您将如何处理查询以产生以下所需的结果?会有更好的桌子设计吗?
+----------------------------------------------+
| Date | Time | NumOne | NumTwo | NumThree |
+----------------------------------------------+
| 01/02/14 | M | 8 | 2 | 1 |
| 01/02/14 | E | 8 | 8 | 8 |
| 01/03/14 | M | 1 | 9 | 4 |
| 01/04/14 | E | 0 | 7 | 5 |
+----------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
+----------------+
| Number | Count |
+----------------+
| 0 | 1 |
| 1 | 2 |
| 2 | 1 |
| 3 | 0 |
| 4 | 1 |
| 5 | 1 |
| 6 | 0 |
| 7 | 1 |
| 8 | 4 |
| 9 | 1 |
+----------------+
Run Code Online (Sandbox Code Playgroud)
+-----------------------------------------------------------------------------------------------+
| TypeOfLottery | MinRegNum | MaxRegNum | NumOfRegPicks | MinSpeNum | MaxSpeNum | NumOfSpePicks |
+-----------------------------------------------------------------------------------------------+
| Pick3 | 0 | 9 | 3 | 0 | 0 | 0 |
| Pick4 | 0 | 9 | 4 | 0 | 0 | 0 |
| Powerball | 1 | 51 | 6 | 1 | 45 | 1 |
+-----------------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
现在我想想,我看不出有任何理由拥有这张桌子。如果我只是为每种应该工作的乐透类型创建了一个新表。如果我想更进一步,上表会给我每个乐透的“规则”。
Mat*_*Mat 10
以不同方式保存数据会使该查询变得微不足道。即:每行一个数字。就像是:
results(Date, Time, Rank, Number)
Run Code Online (Sandbox Code Playgroud)
其中Rank第一个数字为 1(或零),第二个数字为 2,依此类推(仅当订单具有重要性时,如果不重要,则降低排名。)
然后您的查询归结为(忽略保留标识符):
select number, count(*)
from results
-- where date = ...
group by number
order by number;
Run Code Online (Sandbox Code Playgroud)
使用您当前的架构,您仍然可以通过以下方式轻松获得它union:
select number, count(*)
from (
select NumberOne as number from Results
union all
select NumberTwo as number from Results
union all
select NumberThree as number from Results
) AllNumbers
group by number
order by number;
Run Code Online (Sandbox Code Playgroud)
(或使用with AllNumbers as (...)CTE。)
当涉及到将您的应用程序扩展到三个以上的数字时,很明显哪种解决方案获胜 - 您真的不想为每种类型的抽奖添加更多列,或者生成大量联合列表。
不过,我看到了一个问题:每一行都有大量数据重复。如果您需要添加带有“类型”抽奖的列(以区分“选择 3”、“选择 4”或您想要的任何类型的游戏),则更是如此。
您可以通过仅存储“绘图 ID”、(可选)等级和编号来缓解这种情况,并使用另一个表来存储每个绘图 ID 的“元数据”。可能有更适合您的应用程序的中间方案 - 取决于您可以/想要进行哪些权衡。
| 归档时间: |
|
| 查看次数: |
734 次 |
| 最近记录: |