在关系数据库中存储矩阵

Jim*_*mmy 19 sql database-design matrix-storage

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

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

谢谢!

编辑:

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

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

例:

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

RBa*_*ung 23

有很多方法可以做到这一点,我们需要更多的信息来更具体地说明什么是最适合你的.但是,这是两种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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

主要缺点是数据开销通常存在很高的空间.许多人认为插入或检索新矩阵的开销也很高,但实际上有几种记录的技术可以使它非常快.


3Da*_*ave 5

显存,一个很简单的二维矩阵存储如下:

ABCD
EFGH
IJKL
Run Code Online (Sandbox Code Playgroud)

在 ram 中像数组一样按顺序排列

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

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

[y*width+x]
Run Code Online (Sandbox Code Playgroud)

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

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

存储在逗号分隔的列表中可以让您在 nvarchar 字段中放置任意大小的矩阵。这假设您不需要在 SQL 中查询单个单元格,而只需将矩阵作为一个整体抓取并在客户端进行处理。

您的表可能如下所示:

tbl_matrices
----
id
user_id
matrix nvarchar(max)
Run Code Online (Sandbox Code Playgroud)