代码之家  ›  专栏  ›  技术社区  ›  Jimmy

在关系数据库中存储矩阵

  •  17
  • Jimmy  · 技术社区  · 16 年前

    我正在为一个客户机开发一个项目,并正在进行初步的数据库设计。这个项目将是一个简单的Web应用程序,用于跟踪矩阵图中的流程及其结果,我正在寻找一种将它们存储在关系表中的好方法。

    现在,我想我有一个常规的表格,X和Y坐标也会从中映射出来,可能是一个包含坐标ID的查找表,其中记录了一个“命中”。有人有更好的方法吗?

    谢谢!

    编辑:

    这仅仅是项目的开始,所以到目前为止我的细节还有限,但是我在多个表后面的主要推理是因为这些矩阵在大小上是完全动态的,并且是通用的,所以每个矩阵都可能是不同的,并且它们将绑定到一个用户。

    我还忘了提到x/y值的顺序很重要,这进一步支持了我在为x y和值创建多个表之后的推理,因此我强烈认为需要了解每个单元格很重要。

    例子:

    这方面的基本例子(尽管是抽象的)就在于餐厅的流程。这些活动包括坐下来,点食物,看菜单,点饮料,吃东西,付钱等等。结果是点了,送了饮料,送了食物,给了改变。虽然看起来很简单,但当考虑到每一次发生的事情都不一样时,它就会变得复杂起来,也就是在外卖或自助餐的情况下。行动和结果的顺序在看到情况之间的差异时变得不可或缺。

    4 回复  |  直到 9 年前
        1
  •  20
  •   Pavel Oganesyan    9 年前

    有很多方法可以做到这一点,我们需要更多的信息来更具体地说明什么对您最有利。但是,这里有两种SOP方法:

    每个矩阵都有一个单独的表:

    CREATE TABLE YourMatrixName(
        RowNo smallint NOT NULL,
        ColNo smallint NOT NULL,
        CellValue varchar](50) NULL,
     CONSTRAINT [PK_Matrices] PRIMARY KEY CLUSTERED 
        ([RowNo] ASC, [ColNo] ASC)
    ) ON [PRIMARY];
    GO
    
    CREATE UNIQUE NONCLUSTERED INDEX IX_YourMatrixName ON dbo.YourMatrixName
        (ColNo, RowNo); 
    GO
    

    或者,一张表中的所有矩阵:

    CREATE TABLE Matrices(
        MatrixName varchar(24) NOT NULL,
        RowNo smallint NOT NULL,
        ColNo smallint NOT NULL,
        CellValue varchar(50) NULL,
     CONSTRAINT [PK_Matrices] PRIMARY KEY CLUSTERED 
        ([MatrixName] ASC, [RowNo] ASC, [ColNo] ASC)
    ) ON [PRIMARY];
    GO
    
    CREATE UNIQUE NONCLUSTERED INDEX IX_Matrices ON dbo.Matrices
        (ColNo, RowNo); 
    GO
    

    这些都是标准的正常形式,实际上所有其他的方法都没有很好地规范化。这些方法的一些优点:

    1. 您不必填写每个单元格,只需填写您正在使用的单元格。或者有一个默认值(0或“”)并跳过这些值。
    2. 这很容易是最灵活的方法,即使在“一体式”模型中,也不需要以任何方式将它们限制为相同的大小,而且很容易调整它们的大小。
    3. 您可以轻松查询 内容 对于矩阵,在更紧凑的存储方法中变得越来越困难。
    4. “hit”或矩阵单元的任何其他方面都很容易作为行中的附加字段实现。如果您担心额外的空间,可以将它们设为空,如果您想单独查询/报告这些属性,可以对它们进行索引。它还可以很容易地用这个模型来改进像这样的功能。

    主要缺点是,数据开销通常很高。许多人认为插入或检索新矩阵也有很高的开销,但事实上,有几个文档技术可以使它非常快。

        2
  •  4
  •   anon    16 年前

    你的矩阵是密集稀疏的吗?如果它是稀疏的,那么每个条目最好只存储命中的列表,而不是有一个基本上是0的完整的二维表。

        3
  •  3
  •   Tom H zenazn    16 年前

    我只使用一张表(x,y,outcome),而不是两张表。除此之外,对于所提供的有限信息,很难给出更多的建议。

        4
  •  3
  •   3Dave    16 年前

    视频存储器,一个非常简单的二维矩阵存储如下:

    ABCD
    EFGH
    IJKL
    

    在RAM中,按顺序像数组一样

    A,B,C,D,E,F,G,H,I,J,K,L

    元素x,y可以在数组偏移处找到。

    [y*width+x]
    

    例如,x=2,y=2(从零开始)是指元素k。

    [y*width+x]=[2*4+2]=10. 数组元素10(再次从零开始)=k,所以你很好。

    存储在逗号分隔的列表中可以将任何大小的矩阵放入nvarchar字段。这个 假设不需要查询SQL中的单个单元格 但只需抓住矩阵作为一个整体,并在客户端处理它。

    您的桌子可能如下所示:

    tbl_matrices
    ----
    id
    user_id
    matrix nvarchar(max)
    

    另外,如果矩阵是稀疏的,这也很好地工作,否则最终会得到很多空的,,,,元素。不过,你也可以解决这个问题。

    推荐文章