首页 > 解决方案 > 具有记录类型的数据库范围表或引用表

问题描述

我想在数据库中表示车辆(想想汽车或卡车)。我最多有 62 条信息要为每条信息存储。示例:年份、品牌、型号、驱动类型、制动系统、制造商。车身代码、转向类型、轴距等。这些信息是引用第三方数据库的 ID,该数据库为每个 ID 提供标签。提供商有 1 个表格列出所有品牌,1 个表格列出所有“转向类型”等。

所有车辆都将填充年份、品牌和型号列。几乎没有记录(如果有)将填充超过 10 列。但如果我查看所有车辆,那么每一列都会被至少一条记录使用。

一种方法是创建一个包含 62 列的表。同样,大多数记录在大多数列中都有 NULL 值。

或者,我可以做这样的事情(例如,忽略索引和主键):

create table vehicles (
  id identity(1,1) int,
  year int,
  make int,
  model int
)

create table constraints (
  id identity(1,1) int,
  vehicleId int, -- foreign key to vehicles.id
  constraintTypeId int, -- foreign key to constraintTypes.id
  value int
)

create table constraintTypes (
  id identity(1,1) int,
  name nvarchar(200) -- Example: "wheel base", "brake system" etc
)

使用第二种方法,如果车辆只存储 2 条信息(除了年份、品牌、型号),那么它在表约束中将有 2 条记录。

用户希望有一个页面来查看所有应用程序。如果我有一个包含 62 列的表,我需要在查询中加入 62 个连接来获取标签。我可以在车辆上存储标签以加快检索速度,但与源数据中的标签更改相比,更新我的车辆表可能会很慢。

目前有超过 1200 万条车辆记录,并且源数据每月都会更改(添加、删除和一些标签更改)。

拥有更多列是否是更好的设计,即使大多数总是只是 NULL。还是第二种方法更好?甚至如何计算最佳方法?即使我有 62 列,它们都对每辆车都有效,但出于编目目的,大多数都是空的。例如,如果一条记录应该匹配任何“1999 Dodge Viper”(无论转向类型或车身风格等),用户不想填充所有 62 列,他们只想看到一条“1999 Dodge”的记录毒蛇”。

标签: sql-server-2012

解决方案


您的问题是与数据异常和规范化相关的一般问题的具体案例。 https://en.wikipedia.org/wiki/Database_normalization

尽管经验表明存在“更好”和“更差”的答案,但没有“正确”的答案。所以一个问题可以帮助您进行计划。

  • 要求会改变吗?例如,有一天会有人想要记录制动蹄类型或驾驶员座椅类型吗?如果是,您的 62 列表成为 63(或 99)列表的含义是什么。(在我看来,这导致我走向你的第二种方法)

还要记住感谢 Views 数据的呈现,即使在 DB 中,也不必匹配它的存储。例如,您可以拥有规范化的表格和一个视图来向用户显示 62(或 63 或 99)列。


推荐阅读