一尘不染

在关系数据库中存储矩阵

sql

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

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

谢谢!

编辑:

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

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

例子:

一个基本的例子(尽管是抽象的)在于有关餐厅的过程。这些动作包括坐下,订购食物,查看菜单,订购饮料,进餐,付款等。所取得的结果是订购,饮料交付,食物交付,给定零钱。尽管看似简单,但考虑到它却变得复杂,每次发生的事情都会有所不同,甚至在外带或自助餐的情况下也是如此。在观察情况之间的差异时,动作和结果的顺序变得不可或缺


阅读 398

收藏
2021-03-17

共1个答案

一尘不染

有很多方法可以做到这一点,我们需要更多的信息来更具体地确定最适合您的方法。但是,这是两种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-able,如果要分别查询/报告这些属性,则将它们编入索引。该模型也同样容易改造此类功能。

主要缺点是通常存在很大的数据开销空间。许多人认为插入或检索新矩阵也有高昂的开销,但实际上,有许多记录在案的技术可以使之快速运行。

2021-03-17