【发布时间】:2015-03-25 13:31:54
【问题描述】:
我有几个代码/值/同义词列表(即 ICD 代码),其中包括多个有效期,聚合成版本(每年一个)。
所以现在我可以选择完全标准化的方法,结构如下:
VERSIONS(id INT PRIMARY KEY, name VARCHAR)
CODES(id INT PRIMARY KEY, code VARCHAR)
VALUES(id INT PRIMARY KEY, text VARCHAR)
CODEVALUES(code_id INT FOREIGN KEY CODES.id,
value_id INT FOREIGN KEY VALUES.id,
version_id INT FOREIGN KEY VERSIONS.id,
synonym_nr INT)
with PK(code_id, value_id, version_id)
这样我最多可以有 14 条记录作为代码值,在过去 14 年中没有改变。对于 >14000 个代码,最多包含 20 个同义词,我最终在 CODEVALUES 中有 >2,000,000 条记录。
另一种方法是使用聚合表,例如
CODES(code VARCHAR, value VARCHAR, synonym_nr INT, min_version INT, max_version INT)
没有 FK。对于 code/value/synonym_nr 的每种组合,只有一条记录。
我知道规范化,但我正试图降低开发和管理的复杂性,因为我需要为每个 SQL 表(包括它的关系)提供一个 OR/M 实体,并且因为我有几十个这样的代码列表和因子 4因为班级人数很重要,
我想知道这些替代方案之间是否存在性能差异。
更新:
这些列表上的查询属于此类,即我查找具有特定版本的特定代码并希望该代码的默认值(synonym_nr = 0)。 由于这些查询通常是较大查询的一部分,因此每个查询事务可能会有 10k 到 100k 的此类代码查找。 使用方法#1,我至少有 2 个连接,并且 Db 必须为每个版本保存一个映射记录(代码/值的冗余)。虽然方法#2定义了一个有效的版本范围,但必须通过
WHERE version >= min_version AND version <= max_version
所以它是连接和更多记录(索引效率?)与查询约束中的范围比较。会有显着的性能差异吗?
【问题讨论】:
-
你真的有问题吗?至于您描述的情况,200 万条记录并不是特别大,您想要的大多数查询可能都可以使用索引进行优化。
-
我建议您不要做出非标准的设计决策,以使编码更容易。从长远来看,这将节省很少的时间,但会花费更多。在您如何设计数据库时,绝不应该考虑易于开发。它的设计应该考虑到数据。奇怪的是,当 ddl 正确完成时,它会使 dml 更容易作为奖励。
-
随着您的最新更新,听起来您好像要犯下数据库设计中最严重的罪行之一。即做出非标准的设计决策来处理尚未发生的性能问题。这被称为过早优化,从长远来看会导致各种痛苦。查看有关该主题的这篇文章。 sqlservercentral.com/articles/Performance+Tuning/115825
标签: sql sql-server relational-database database-performance redundancy