Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 存储彩票信息的数据库设计_Mysql_Sql_Ruby On Rails_Database Design - Fatal编程技术网

Mysql 存储彩票信息的数据库设计

Mysql 存储彩票信息的数据库设计,mysql,sql,ruby-on-rails,database-design,Mysql,Sql,Ruby On Rails,Database Design,我正在设计一个系统,我应该存储不同类型的彩票(结果+彩票)。 目前专注于美国百万富翁和新加坡池Toto。它们都有相似的格式 百万富翁:五个不同的数字,从1到56,一个数字从1到46。 Toto:1到45之间的6个数字 我需要拿出一个优雅的数据库设计来存储用户票据和相应的结果。 我想到了两种方法 只需在6列中存储6个数字。 或 创建另一个表(多对多),其中包含球号和票证id 我还需要存储结果的球号 对于TOTO,如果您的数字与4个或更多获奖数字匹配,则您将赢得一份奖品。 对于数百万人来说,也有类似

我正在设计一个系统,我应该存储不同类型的彩票(结果+彩票)。 目前专注于美国百万富翁和新加坡池Toto。它们都有相似的格式

百万富翁:五个不同的数字,从1到56,一个数字从1到46。 Toto:1到45之间的6个数字

我需要拿出一个优雅的数据库设计来存储用户票据和相应的结果。 我想到了两种方法

  • 只需在6列中存储6个数字。 或
  • 创建另一个表(多对多),其中包含球号和票证id
  • 我还需要存储结果的球号

    对于TOTO,如果您的数字与4个或更多获奖数字匹配,则您将赢得一份奖品。 对于数百万人来说,也有类似的过程

    我在寻找利弊或更好的解决方案?
    我已经做了大量的研究和论文工作,但我仍然不知道该怎么做。

    我会使用约定将它们连接起来,并将它们存储在一列中

    大概是10~20~30~40~50~!60' ~z~分隔数字 ! 表示特殊编号(powerball等)


    如果确实需要将结果拆分为列,请使用sql表值函数拆分结果。

    两个表

    tickets
        ball_number
        ticket_id
    
    player
        player_id
        ticket_id
    
    // optional
    results
        ball_number
        lottery_id
    
    对于两个表,您可以使用如下查询:

    select ticket_id, count(ball_number) hits
    from tickets 
    where ball_number in (wn1, wn2, ...) // wn - winning number
    group by ticket_id
    having hits = x
    
    当然,您可以从彩票结果表中获取中奖号码(或将其存储在特殊彩票号码下的balls_表中)

    编制统计数据也会更容易。与

    select count(ticket_id)
    from tickets 
    group by ball_number
    
    你可以很容易地看到哪些数字是被挑选出来的

    您还可以使用一些字段(如彩票号码)来缩小查询范围,因为大多数查询只涉及一次彩票

    一张桌子

    使用一个表,每个数字对应一列,可能会使查询更加复杂。特别是,正如我所相信的那样,数字是经过排序的,除了一个(或两个)数字之外,所有的数字都有奖。您可能需要将
    1,2,3,…
    2,3,4,…
    进行比较,这并不像上面的查询那么简单

    一列


    在一列中存储字符串中的所有条目违反了所有规范化做法,迫使您拆分大多数查询的列,并取消数据库执行的所有优化。存储数字比存储文本需要更少的磁盘空间。

    因为这是一件每天一次的事情,我想我应该以一种易于编辑、维护和可视化的方式存储数据。你的多种方法会奏效。主要是,我希望很容易找到选择特定ball_号码的用户

    users
      id
      name
    
    drawings
      id
      type # Mega Millions or Singapore (maybe subclass Drawing) 
      drawing_on
    
    wining_picks
      drawing_id
      ball_number
    
    ticket
      drawing_id
      user_id
      correct_count
    
    picks  
      id
      ticket_id
      ball_number
    
    输入数字后,查找在图形中拾取特定数字的所有用户ID

    按日期获得图纸

    drawing = Drawing.find_by_drawing_on(drawing_date)
    
    通过球号和图纸获得用户

    picked_1 = User.picked(1,drawing)
    picked_2 = User.picked(2,drawing)
    picked_3 = User.picked(3,drawing)
    
    这是用户的作用域

    class User < ActiveRecord::Base
    
      def self.picked(ball_number, drawing)
        joins(:tickets => :picks).where(:picks => {:ball_number => ball_number}, :tickets => {:drawing_id => drawing.id})
      end
    
    end
    
    对于每个获胜者-使用正确的计数更新门票


    我可能会单独存储获奖者,但有了正确计数的索引,并且票证中没有太多数据,现在可能还可以。

    首先,让我说我是一个Oracle人员,而不是MySQL人员

    第二,我通常会说采用标准化设计,但我想在这里想出一个非常非传统的替代方案,我会在这里发表评论

    您是否将其非规范化,以便对所有数字选择使用一列

    ticket_id      integer
    nums           bit(56)
    special_number integer
    
    这将是一个非常紧凑的表示,您可能可以使用位操作来查找赢家或潜在赢家


    不知道这是否可行。。。打开以供评论。

    您将存储多少条记录?你是否期望有一个大的数据集,数周的用户输入,等等?过去3年每次抽奖的结果。用户可以添加票据。因此,是的,数据会随着时间的推移而增长(但绝对不会以非常大的规模增长)。我认为这不是一个好主意,因为这会使查询表变得困难/缓慢。如果你真的认为这是个好主意,可以补充一下你这么认为的原因吗?请添加“只是串联”的优点和缺点?我喜欢你的方法,尽管你没有提到如何存储中奖号码(相同的方式?),这是一个很好的观点。我加了一张获胜的选秀表。您可以潜在地重用拾取,但最好将其分开。这将更容易看到和保持安全。谢谢,这是有意义的,我从一开始就倾向于这样:)你能详细说明模式吗?另外,在您的查询中,您所说的彩票号码是什么意思?哦,对不起,我指的是彩票id。我刚刚在答案中修复了它,并添加了模式。由于您有两种彩票类型,您可以通过引入两组表格或通过附加列
    lotking\u type
    将它们分开。在模式和代码中,我假设这里有单独的表解决方案。我接受了Swards的答案。我不知道你们为什么要把票证id放在播放器表中。为了能够找到票证的所有者,难道你们不认为在票证表中存储播放器id更有意义吗?这个问题或多或少集中在设计上,而不是一个特定的dbms。如果我使用一列来存储所有数字,我将无法进行最简单的查询,例如获取分组依据和计数等。
    ticket_id      integer
    nums           bit(56)
    special_number integer