代码之家  ›  专栏  ›  技术社区  ›  JR Lawhorne

关系数据库是否非常适合向量计算?

  •  2
  • JR Lawhorne  · 技术社区  · 15 年前

    基本表模式如下(我使用的是mysql btw):

    integer unsigned vector-id
    integer unsigned fk-attribute-id
    float attribute-value
    primary key ( vector-id , fk-attribute-id )

    这个 矢量 在表中用相同的多个记录表示 向量ID

    我需要用这个表中存在的所有向量的点积(也就是欧几里得距离)构建一个单独的表。所以,我需要一个这样的结果表:

    integer unsigned fk-vector-id-a
    integer unsigned fk-vector-id-b
    float dot-product


    …像这样的一个…

    integer unsigned fk-vector-id-a
    integer unsigned fk-vector-id-b
    float euclidean-distance

    产生结果的最佳查询结构是什么?

    对于非常大的向量,关系数据库是解决这个问题的最佳方法,还是应该在应用程序中内化向量并在那里进行计算?

    1 回复  |  直到 15 年前
        1
  •  4
  •   Quassnoi    15 年前
    INSERT
    INTO    dot_products
    SELECT  v1.vector_id, v2.vector_id, SUM(v1.attribute_value * v2.attribute_value)
    FROM    attributes v1
    JOIN    attributes v2
    ON      v2.attribute_id = v1.attribute_id
    GROUP BY
            v1.vector_id, v2.vector_id
    

    MySQL ,这可以更快:

    INSERT
    INTO    dot_products
    SELECT  v1.vector_id, v2.vector_id,
            (
            SELECT  SUM(va1.attribute_value * va2.attribute_value)
            FROM    attributes va1
            JOIN    attributes va2
            ON      va2.attribute_id = va1.attribute_id
            WHERE   va1.vector_id = v1.vector_id
                    AND va2.vector_id = v2.vector_id
            )
    FROM    vector v1
    CROSS JOIN
            vector v2