我有一个数据源,可以生成数百万个二维双倍数组(矩阵)的条件。维度的大小不断变化(但可以通过数学变换简化情况,只允许一个维度改变大小)。因此,我需要将这个矩阵的所有状态保存到数据库中(她的大约大小从10x50到10x100 -第二维大小随时间变化)。如果我使用时间作为主键,这意味着我将不得不创建数百万个表,每个表将包含10列和50到100行……这不是很方便。有没有更有效地对矩阵状态进行分组的方法?我是SQL的新手。
发布于 2013-03-22 18:48:53
下面是一个包含以下列的表:
(id,) state_number、行、列、值
发布于 2013-03-22 19:09:15
理论:如何使用繁重的工具(如MySQL)
MySQL通常被归类为“重型工具”。重型工具很好地解决了相当广泛的问题,但通常也有其独特的特点,即它们做得好、做得差或根本不做。对于所有的重型工具,挑战是在您的问题和重型工具的特性之间找到最接近的匹配,然后以最简单的方式弥合差距。您正在执行步骤2。
解决方案第1步:您与工具之间最接近的匹配
对于您的特定问题,我所能找到的最接近MySQL特性的匹配是与您的相同的:如下所示的表。
列:
id dataset_time col1 col2 col3 col4 col5 col6 col7 col8 col9 col10
auto increment: id
primary key: id
解决方案第2步:弥合剩余差距
但是,正如您已经注意到的,为每个矩阵创建一个表并不是弥合您的问题和MySQL所能做的事情之间剩余差距的最简单方法。MySQL可以在表名中使用数字索引创建数以千计的表,但它在这方面做得很差。
弥补这一差距的最简单方法是引入一个名为dataset_id的额外列,使该表看起来像这样:
列:
id dataset_time col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 dataset_id
auto increment: id
primary key: id
non-unique index: dataset_id
您应该手动递增dataset id,并将其插入每一行和相应的时间。这比通过时间识别每个数据集更健壮。
然后,您可以像这样检索数据集:
SELECT * FROM matrices WHERE dataset_id=761
MySQL具有高效的索引功能和优雅的语法,可以从数百万行中检索几十行,因此可以说它做得非常好。这就是你的最佳解决方案。
https://stackoverflow.com/questions/15568401
复制相似问题