【问题标题】:How to store matrix information in MySQL?如何在 MySQL 中存储矩阵信息?
【发布时间】:2010-04-19 05:06:05
【问题描述】:

我正在开发一个分析音乐相似性的应用程序。为此,我处理音频数据并将结果存储在 txt 文件中。对于每个音频文件,我创建 2 个文件,1 个包含 16 个值(每个值可以是这样的:2.7000023942731723),另一个文件包含 16 行,每行包含 16 个值,如前面所示。

我想将这 2 个文件的内容存储在我的 MySQL 数据库的表中。

我的桌子是这样的:

Name varchar(100)
Author varchar (100)

为了添加这两个文件的内容,我认为我需要使用 BLOB 数据类型:

file1 blob
file2 blob

我的问题是我应该如何将这些信息存储在数据库中?我正在使用 Java,其中有一个包含 16 个值(用于 file1)的双精度数组和一个包含 file2 信息的矩阵。我应该将值作为字符串处理并将它们添加到我的数据库中的列中吗?

谢谢

【问题讨论】:

    标签: java mysql blob


    【解决方案1】:

    希望我不会因为这个疯狂的答案而被否定,但我正在尝试跳出框框思考。我的第一个问题是,您在潜在查询后如何处理这些数据?如果我在做类似的事情,我可能会使用 matlab 或 octave 之类的东西,它们具有表示矩阵的特定符号。它基本上是一堆逗号和分号分隔的文本,在正确的位置带有方括号。我只会存储一个我的数学软件或模块可以本地解析的字符串。毕竟,听起来您并不想基于数据点进行某种查询。

    【讨论】:

    • 我正在使用 Java。该数据用于执行数学运算。我想知道是否有在表格的列中存储矩阵(16x16)。
    • 我仍然会将它以易于解析的格式存储为字符串。也许使用空格分隔列,使用分号分隔行。这样,您就不会遇到点、逗号和工程符号的数字问题。使用 split 获取行,然后在这些行上拆分以获取单元格是一件简单的事情。
    • 任何东西都可以被解析,但是如果你对矩阵做大量的操作,你为什么要花费 CPU 周期来构建字符串并在输出时解析呢?另一种方法是 JOIN,但至少数据仍然是其本机类型。如果您想要对特定行或列进行操作怎么办? JOIN 让这一切变得简单;一个 BLOB 会让人很痛苦。
    • 不幸的是,我无法评论进行连接以操作本机数据与使用字符串进行双重转换的成本。我全是耳朵!对我来说,仅仅通过查看一个字段来理解数据的简单性远远超过了选择一堆 SQL 查询来避免转换的好处。如果你想要一个特定的行,那么你编写一个函数来给你想要的行。不优雅,但几乎任何可以编写简单代码的人都可以理解。
    【解决方案2】:

    如果您打算将其保存在关系数据库中,我认为您需要对这样的架构进行规范化。

    听起来您有一个与其文件具有一对多关系的矩阵表。

    如果您坚持使用一个非规范化表,一种方法是存储文件的名称、作者、矩阵的名称以及它在拥有它的命名矩阵中的行和列位置。

    请澄清一件事:这是线性代数意义上的矩阵吗?一个数学实体?

    如果是,并且您只使用整个矩阵,那么也许您可以将它作为 blob 存储在单个列中。这仍然迫使您在每次进入和退出数据库时序列化和反序列化为字符串或 blob。

    【讨论】:

    • 我不完全理解你。表中的每一行都包含一个文件的名称、它的作者和我想添加提取的信息,这些信息现在存储在 .txt 文件中。
    • 好的,想象一下我只想在表格的列中存储一个矩阵(16x16),我该怎么做?在 MySQL 中创建此列时应该使用什么数据类型?
    • +1 我也打算推荐一个博客。对于非常简单的事情,这似乎是很多处理。将矩阵转换为 csv 字符串并存储它可能会更容易。
    • @Jim Schubert,如果有任何需要检查其内容的用例,我不鼓励使用 blob。当我读到“matrix”和“blob”时,我的第一个想法是这是一个坏主意,我不鼓励它。如果我以虚假的借口赢得投票,请随意删除您的赞成票。
    • 博客 => blob。对于那个很抱歉。我觉得你的回答很准确。
    【解决方案3】:

    您需要查询数据(比如所有大于 2.7 的值)还是只存储它(您总是从数据库中加载整个文件)?

    鉴于评论中的信息,我会将文件保存在 BLOB 或 TEXT 中,就像其他答案中所说的那样。您甚至不需要行分隔符,因为您可以对值列表进行取模运算以获取矩阵的行。

    【讨论】:

    • 我只需要存储它。现在,此信息存储在 2 个 .txt 文件中。当我需要读取这些文件时,我总是需要读取所有值。我只想知道如何使用 MySQL 而不是使用文本文件来做到这一点。感谢您的帖子
    【解决方案4】:

    我认为dedalo 面临的问题是他正在处理数组(我假设一个是锯齿状的,一个是多维的)并且他想将这些序列化为blob。

    但是,数组不能直接序列化,所以他在问如何去做。

    最简单的方法是遍历数组并按照 Dave 的建议构建一个字符串并存储该字符串。正如 duffymo 指出的那样,这将允许您从数据库中的值查看内容,而不是在需要检查数据时反序列化数据。

    如果您想知道如何将数组序列化为 BLOB...(这似乎有点矫枉过正)

    你可以serialize one-dimensional arraysjagged arrays,例如:

    public class Test {
        public static void main(String[] args) throws Exception {
    
            // Serialize an int[]
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("test.ser"));
            out.writeObject(new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9});
            out.flush();
            out.close();
    
            // Deserialize the int[]
            ObjectInputStream in = new ObjectInputStream(new FileInputStream("test.ser"));
            int[] array = (int[]) in.readObject();
            in.close();
    
            // Print out contents of deserialized int[]
            System.out.println("It is " + (array instanceof Serializable) + " that int[] implements Serializable");
            System.out.print("Deserialized array: " + array[0]);
            for (int i=1; i<array.length; i++) {
                System.out.print(", " + array[i]);
            }
            System.out.println();
        }
    }
    

    至于在 MySQL 中存储什么数据类型,there are only four blob types to choose from:
    The four BLOB types are TINYBLOB, BLOB, MEDIUMBLOB, and LONGBLOB

    选择最好的取决于序列化对象的大小。我想BLOB 就足够了。

    【讨论】:

    • 您好,此时此信息存储在 txt 文件中。这很好用。但是,我的经理希望我尝试将其存储在 MySQL 表中。起初我想按照 Dave 的建议去做,但我想知道是否可以将文件添加到数据库中,或者是否有其他方法可以做到这一点。谢谢
    • 这段代码展示了如何序列化数组。您应该能够像使用任何其他 SQL 一样将 Stream 对象写入表,您只需将数据类型指定为 BLOB。如果是如何将字节数组放入数据库的问题,请查看java2s.com/Code/Java/Database-SQL-JDBC/InsertpicturetoMySQL.htm 我想您的问题有点难以理解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    相关资源
    最近更新 更多