0

使用 SQL Server 我有一个带有计算列的表。该列连接 60 列:

CREATE TABLE foo 
(
    Id INT NOT NULL,
    PartNumber NVARCHAR(100),

    field_1 INT NULL,
    field_2 INT NULL,
    -- and so forth
    field_60 INT NULL,

    -- and so forth up to field_60
)

ALTER TABLE foo 
    ADD RecordKey AS CONCAT (field_1, '-', field_2, '-', -- and so on up to 60
                            ) PERSISTED

CREATE INDEX ix_foo_RecordKey ON dbo.foo (RecordKey);

为什么我使用持久列:

  • 不需要索引 60 列
  • 通过仅检查一列来测试当前记录是否存在

该表将包含不少于 2000 万条记录。添加/插入/更新经常发生,一些二进制文件每次运行都会进行数万次插入/更新/删除,我们希望这些操作快速且有效。

目前我们有 C# 代码来管理 table 中的记录foo。它有一个函数,可以按照与计算列相同的顺序连接相同的字段。如果已经存在具有相同连接键的记录,我们可能不会插入,或者我们可能会插入但调用我们通常可能不会调用的其他函数。

这是一个糟糕的设计吗?我看到的最大危险是代码是否因任何原因与计算列的串联顺序不匹配(如果一个被编辑但另一个没有被编辑)。

规则/要求

  • 我们想在 JQGrid 中显示记录。如果记录来自单个表或视图,我们已经有了可以这样做的 C#
  • 我们需要检查两条记录的能力,以验证它们是否在所有 60 列中都具有相同的值
4

1 回答 1

1

更好的桌子设计是

parts table
-----------
id
partnumber
other_common_attributes_for_all_parts


attributes table
----------------
id
attribute_name
attribute_unit (if needed)


part_attributes table
---------------------
part_id (foreign key to parts)
attribute_id (foreign key to attributes)
attribute value

它看起来很复杂,但由于正确的索引,即使part_attributes包含数十亿条记录,它也非常快!

于 2020-05-14T14:39:09.400 回答