一张或几张属性表

use*_*609 2 database-design sql-server optimization

我只是花了一些时间与一位同事讨论了两种可选的数据库设计,但我并不相信。我们都不是严格的 DBA,所以我们可能会遗漏一些东西。

总体目标是为三个(可能是 4 个)实体中的每一个创建附加开放式自由文本属性的能力。

我们将业务实体称为 Device、Location 和 Part;他们之间有关系。

设计 A:创建 DeviceAttribute、LocationAttribute 和 PartAttribute 表,每个表都有一个 ID、参考 ID(FK 到相应的表)、名称、值和类型。

设计 B:创建具有(ID、名称、值和类型列)和三个引用表的属性表 - 每个表保存从实体表之一到属性表 ID 之一的引用。

主要关注的是性能:
- 仅查询实体的数据时,3 个单独的 xxxAttribute 表会表现得更好,例如“给我设备 X 及其所有属性”,还是两种设计的性能相同?- 查询具有给定属性名称/值的实体时,1 属性表(设计 B)是否会表现得更好,例如“给我所有具有 Attribute.Name='GPS' 的实体”,或者是否等同于查询结合了设计 A 的 3 个表?- 在设计 B 的情况下:实体表(位置、设备、部件)上的更新是否会导致锁定其他实体表中的查询?

系统可能有数以万计的部件、数以千计的设备和数百个位置,并且可能必须以每秒数十到数百个查询的数量级进行处理。

Aar*_*and 7

我更喜欢单表的几个原因:

(1) 对于多个表,您几乎总是在执行联合,并且多次为核心数据付费

(2) 您可以轻松优化属性的子集或带有索引的设备和属性的组合,并使用稀疏列来最小化浪费的空间

我在这里写了一些关于 EAV 的内容——它绝不是完美的,但我们在以前的工作中用它解决了许多性能问题(以其他人为代价)。