在关系数据库中存储矩阵

时间:2010-01-26 20:55:07

标签: sql database-design matrix-storage

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

现在我正在考虑我有一个常规表格,其中x和y坐标也将映射,也许可以从包含记录“点击”的坐标ID的查找表中删除。有人有更好的方法吗?

谢谢!

编辑:

这只是项目的开始,所以我的细节仍然有限,但我在多个表背后的主要原因是因为矩阵的大小和通用性是完全动态的,所以每个矩阵可能是不同的,它们将是绑定到用户

我也忘了提到x / y值的顺序很重要,这进一步支持了我为xy和值设置多个表背后的推理,由此我强烈假设需要知道每个单独的单元格是重要的

实施例

这个基本的例子(尽管是抽象的)在于关于餐馆的过程。这些行为是坐下来,订购食物,查看菜单,订购饮料,吃饭,支付等等的结果。订单的结果,交付的饮料,交付的食物,给予的变化。虽然看起来很简单,但考虑到每次出现的事情都会有不同的情况变得复杂,同样在取出或自助餐的情况下也是如此。在看到情况之间的差异时,行动和结果的顺序是不可或缺的

4 个答案:

答案 0 :(得分:22)

有很多方法可以做到这一点,我们需要更多的信息来更具体地说明什么是最适合你的。但是,这是两种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. “命中”或矩阵单元的任何其他方面很容易实现为行中的附加字段。如果您担心额外的空间,请将它们设置为Null,如果要分别查询/报告这些属性,请将它们编入索引。使用此型号也可以轻松改装此类功能。
  5. 主要缺点是数据开销通常很高。许多人认为插入或检索新矩阵的开销也很高,但实际上有一些文档化的技术可以使它非常快。

答案 1 :(得分:4)

你的矩阵是否稀疏?如果它是稀疏的,那么每个条目可能更好地存储命中列表,而不是具有大多数为0的完整2D表。

答案 2 :(得分:4)

视频内存,一个非常简单的2D矩阵存储如下:

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)

此外,如果你的矩阵很稀疏,那么这种方法效果非常好,否则你会得到很多空的,,,,,元素。不过,你也可以解决这个问题。

答案 3 :(得分:3)

我只使用一个表而不是两个表:(x,y,结果)。除此之外,很难再根据给出的有限信息提供更多建议。