23

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

现在我在想我有一个通用的例程表,x 和 y 坐标也将映射,并且可能从包含记录“命中”的坐标 ID 的查找表中脱离出来。有人有更好的方法吗?

谢谢!

编辑:

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

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

例子:

这方面的基本示例(尽管是抽象的)在于有关餐厅的过程。行为包括坐下、点菜、查看菜单、点饮料、吃饭、付款等。结果是点餐、送餐、送餐、找零。虽然看起来很简单,但如果考虑到每次发生的事情都不同,就变得复杂了,在外卖或自助餐的情况下也是如此。在看到情况之间的差异时,行动和结果的顺序变得不可或缺

4

4 回答 4

26

有很多方法可以做到这一点,我们需要更多信息才能更具体地了解最适合您的方法。但是,这里有两种 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,如果您想单独查询/报告这些属性,请对它们进行索引。使用此型号也可以轻松改造此类功能。

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

于 2010-01-26T21:18:46.740 回答
5

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

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)
于 2010-01-26T21:06:20.670 回答
4

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

于 2010-01-26T20:57:42.873 回答
3

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

于 2010-01-26T20:58:47.257 回答