Sql server 2012 数据库范围的表或记录类型为的引用表

Sql server 2012 数据库范围的表或记录类型为的引用表,sql-server-2012,Sql Server 2012,我想在数据库中表示车辆(比如汽车或卡车)。我有多达62条信息,我想为每一条存储。示例:年份、品牌、型号、驱动类型、制动系统、制造商。车身代码、转向类型、轴距等。这些信息是参考第三方数据库的Id,该数据库为每个Id提供标签。提供商有一个表列出所有品牌,一个表列出所有“转向类型”,等等 所有车辆都将填充“年份”、“品牌”和“车型”列。几乎没有任何记录(如果有)将填充超过10列。但如果我查看所有车辆,那么每个列都会被至少一条记录使用 一种方法是使用一个包含62列的表。同样,大多数记录在大多数列中都有空

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

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

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

或者,我可以这样做(为了示例,忽略索引和主键):

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

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

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


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

您的问题是与数据异常和标准化相关的一般问题的具体案例

没有“正确”的答案,尽管经验表明有“更好”和“更差”的答案。因此,有一个问题可以帮助你制定计划

  • 这些要求会改变吗?有一天会有人想要吗 记录制动蹄类型或驾驶员座椅类型?如果是,有什么建议 62列表变为63(或99)列的含义 桌子(在我看来,这让我想到了你的第二种方法)

还要记住,由于视图的缘故,即使在数据库中,数据的表示也不必与它的存储相匹配。例如,您可以使用标准化良好的表格和视图向用户显示62(或63或99)列。

列的数量取决于行业标准,该标准在过去6年中没有改变。不过,我理解你关于改变的观点。如果我使用第二个方法,并且希望视图与第一个方法匹配,那么这将是一个包含59个联接的查询。我认为5到6次以上的连接被认为是相当过分的?你自己并没有尝试过用谷歌搜索“扭转局面”,对吗?;)当然,在写之前,我检查了它,得到了预期的结果。另外,当使用RDBMS时,我不太熟悉,我用谷歌搜索同样的东西。我得到的最初几个结果是关于Excel的。这是一个类似的效果,但是他们没有提到在MSSQL中做同样事情的效率。我不是在问如何做(我给出了做这件事的模式),我是在问在我的特殊情况下这样做是否明智。
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
)