【发布时间】:2012-07-25 15:47:56
【问题描述】:
我将在我的网站上运行彩票,因此需要有一个地方来存储彩票和号码。我肯定会有一个名为tickets 的表,其中每一行都有自己的票号、相关联的彩票ID 和所有其他信息(例如所属用户的ID)。
但是,我的问题是我是否应该在tickets 中创建另一个字段来保存票证上选择的数字。不能创建多个字段,例如number1、number2 等,因为每个彩票都会有不同类型的彩票(即lottery1 可能会要求您选择 4 个号码,lottery2 可能会要求您选择6).
所以我可以创建一个 VARCHAR 或 TEXT 的新字段来接受逗号分隔的票号,即:1,2,3,4,5,6 或创建另一个名为 numbers 的新表,其中每一行都会关联票号和票号用它。但是我不确定这种方法是否非常有效,对于一张 6 个号码的票,tickets 表中需要 1 行,numbers 表中需要 6 行。
这些选项中哪个最有效?或者有比这更好的方法吗?请记住,在抽奖结束时,代码将需要循环检查每张彩票是否中奖 - 所以选项 2 可能过于占用资源。
【问题讨论】:
-
数字“是”一张票的属性,不是吗?在这种情况下,将其作为票证的一部分。使用简单的 CSV 或 DSV 不应自动被视为非规范化,因为号码本身是一个实体,就像 SSN 或电话号码一样。如果乐透号码存储在
min,..,max,则可以使用简单的正则等式和索引。对于“子乐透号码”查询,例如“包含数字 N 的票”,那么这是另一个用例/问题.. -
在我看来,CSV 方法似乎是最有效和最简单的,因为您只需
explode()获取数据即可。 -
为了它的价值,小心您将在当地的法律中进行您的彩票。
-
.. 行数并不是真正的问题(SQL 数据库可以很好地跨行扩展),但听起来问题过于复杂。我强烈建议将数字视为实体。
-
在这种情况下我将如何使用索引?虽然没有一个会员可以购买多张相同的票,但同一张票可以由多个会员购买。
标签: php mysql database-design rows database-performance