具有记录类型的数据库范围表或引用表

时间:2018-06-18 21:53:52

标签: sql-server-2012

我想在数据库中代表一辆车(想想汽车或卡车)。我有多达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”的一条记录蝮蛇”。

1 个答案:

答案 0 :(得分:0)

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

虽然经验表明存在“更好”和“更糟糕”的答案,但没有“正确”的答案。这是一个帮助您规划的问题。

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

还要记住,感谢视图,即使在数据库中,数据的显示也不必与存储相匹配。例如。您可以使用规范化的表格和视图来显示用户62(或63或99)列。