MySQL表结构-存储有限的一组数字

MySQL表结构-存储有限的一组数字,mysql,database,database-design,Mysql,Database,Database Design,我需要在MySQL数据库中存储一组数字。我需要一些帮助来确定要使用的最佳表结构 每行将存储20个数字以及一个ID。数字的范围可以是1到80,并且在这一系列数字中没有重复 最初,我创建了一个包含21列、一个ID和20列的表结构,这些列存储每个数字 Id | Num1 | Num2 | Num3 | Num4 | Num5 | etc.. | ---------------------------------------------------------- 0001 |

我需要在MySQL数据库中存储一组数字。我需要一些帮助来确定要使用的最佳表结构

每行将存储20个数字以及一个ID。数字的范围可以是1到80,并且在这一系列数字中没有重复

最初,我创建了一个包含21列、一个ID和20列的表结构,这些列存储每个数字

Id     | Num1  | Num2  | Num3  | Num4  | Num5  |  etc..  |
----------------------------------------------------------
0001   |   1   |   4   |  15   |  22   |  39   |  43     |
0002   |   3   |   5   |  22   |  43   |  55   |  58     |
0003   |   1   |   3   |  5    |  6    |  15   |  26     |
Id     |   1   |   2   |   3   |   4   |   5   |  etc..  |
----------------------------------------------------------
0001   | True  | False | False | True  | True  | False   |
0002   | False | False | True  | False | True  | False   |
0003   | True  | False | True  | False | True  | True    |
我还想到了一个包含81列、一个ID和80个布尔列的表,这些列表示每个数字

Id     | Num1  | Num2  | Num3  | Num4  | Num5  |  etc..  |
----------------------------------------------------------
0001   |   1   |   4   |  15   |  22   |  39   |  43     |
0002   |   3   |   5   |  22   |  43   |  55   |  58     |
0003   |   1   |   3   |  5    |  6    |  15   |  26     |
Id     |   1   |   2   |   3   |   4   |   5   |  etc..  |
----------------------------------------------------------
0001   | True  | False | False | True  | True  | False   |
0002   | False | False | True  | False | True  | False   |
0003   | True  | False | True  | False | True  | True    |
任何人都可以对每个表结构的优缺点提出一些建议,以及在搜索此表时更容易使用的建议。 例如,我们需要搜索包含1、2、5、66和79的每一行。 或包含16、33和4的每一行


任何指导都将不胜感激

你要找的东西叫做;一种组织数据的方法,可防止重复和异常,如无意中更改一条记录而更改另一条记录

更高的标准形式取决于数据的含义,您没有告诉我们,但在开始时,您应该避免使用有序或不确定的列,如Num1、Num2。。。并将列拆分为行:

  ID  Num
0001    1
0001    4
0001   15
...
0002    3
0002    5
...
一般来说,任何时候你发现自己添加了一堆列,这些列取决于它们的位置,你就是在犯错误。SQL有许多用于聚合、组合、排序和报告行的函数。使用SQL的功能生成所需的结果;不要试图使数据库模式看起来像最终打印的报告

在回答您的评论时,查询只返回NUM为1、4和15的ID,而不返回其他ID:

select ID from YourTable
where Num in (1, 4, 15)
group by ID
having Count(ID) = 3
如果NUM可以复制,您将需要countdistinct ID。如果您可以有不同的NUM计数进行匹配,则必须创建一个NUM临时表进行匹配,并使用having countID=select CountNum from TemporaryTable


请注意,SQL Server已经有一个master..spt_值整数表,用于此类情况;我不知道MySql是否有这样的功能,但是如果您需要的话,它们很容易生成。

谢谢您的回复。我确实理解规范化的概念,但是对于上面的表结构如何适用于select命令,我有点困惑。例如,如何选择包含1、4和15的ID?@user3780155,请参阅我的编辑。如果这不是您想要的,请提供示例查询和预期结果。如果我正确理解了您的需求,您将能够更高效地处理查询,方法是使用一个db结构,在单独的行中定义每个数字,在您定义的情况下为80。考虑行,而不是列!谢谢你的两个回复@Doug High Arch-实际上这正是我一直在使用的查询,它确实返回包含所有数字的ID。我现在遇到的问题是,我不仅想要得到ID,还想要得到数字集中每个ID对应的数字。我已经能够得到所需的结果,但查询只需约6000行,耗时近15秒。”代码'