车辆识别号码(VIN)设计

时间:2012-10-21 03:25:00

标签: sql database-design

我为不同的OEM设计了一些Vehicle Identification Number (VIN)解码器。关于VIN编号的事情......尽管有些标准化,但每个OEM都可以重载字符位置代码并对它们进行不同的处理,添加“额外”元数据(即指向VIN编号之外的更多数据的星号)等等。尽管如此所有这一切,我已经能够构建几个不同的OEM VIN解码器,现在我正在尝试构建一个GM VIN解码器,它让我头疼。

问题的关键在于GM根据车辆属性是卡车还是汽车,对车辆属性部分(位置4,5,6,7)的处理方式不同。这是细分:

GM乘用车VIN故障

GM Car VIN

通用汽车卡车VIN故障

GM Truck VIN

通常我所做的是设计我自己的原始ETL进程以将数据导入RDMBS - 每个表大致与主要的VIN细分相关联。例如,将有一个WMI表,EngineType表,ModelYear表,AssemblyPlant表等。然后我构建一个View,它连接一些上下文数据,这些数据可能或不能直接从VIN编号本身的字符代码中收集(例如,某些车型只有某些车辆发动机。)

要查找VIN,只需查询VIEW,即VIN字符串的每个主要字符代码位置细分。例如, 1FAFP53UX4A162757 的示例VIN在不同OEM的VIN结构中就像这样分解:

| WMI | Restraint | LineSeriesBody | Engine | CheckDigit | Year | Plant | Seq   |
| 123 | 4         | 567            | 8      | 9          | 10   | 11    | 12-17 |
---------------------------------------------------------------------------------
| 1FA | F         | P53            | U      | X          | 4    | A     | ...   |

通用汽车已经对此进行了调整......取决于它是汽车还是卡车,角色代码位置意味着不同的东西。

我的意思是 - 下面的每个ASCII表都与SQL表有些相关。 etc..表示存在大量其他列式数据

乘用车

以下是位置4,5(对应车辆线/系列)的示例。这些确实在一起,尽管上面说明了故障,但VIN源数据并没有真正区分位置4和5。

| Code (45)| Line  | Series   | etc..
--------------------------------------
| GA       | Buick | Lacrosse | etc..

..和位置6对应体型

| Code (6) | Style         | etc..
--------------------------------------
| 1        | Coupe, 2-Door | etc..

货车

但是对于卡车来说,结构完全不同。考虑位置4独立于格罗斯车辆重量限制GVWR

| Code (4) | GVWR     | etc..
-------------------------------
| L        | 6000 lbs | etc.. 

..和位置5,6(底盘/系列)现在意味着类似于乘用车的第4,5位:

| Code (56) | Line  | Series  | etc.. 
---------------------------------------
| RV        | Buick | Enclave | etc..

我正在寻找一种在关系设计中解决这个问题的狡猾方法。我希望在解码VIN时返回一个通用结构 - 如果可能的话(即没有为汽车和卡车返回不同的结构)

2 个答案:

答案 0 :(得分:1)

根据您对我是否可以使用其他值识别车辆类型的评论的回答,可能的方法是使用包含公共字段和2个详细信息表的主表,每个表都包含适当的字段汽车或卡车。

大致类似于以下内容(这里我猜WMI是PK):

主表

| WMI | Restraint | Engine | CheckDigit | Year | Plant | Seq   |

| 123 | 4         | 8      | 9          | 10   | 11    | 12-17 |

汽车明细表

| WMI | Veh Line | Series | Body Type |
| 123 | 2        | 3      | 4         |

卡车明细表

| WMI | GWVR | Chassis  |Body Type |
| 123 | 7    | 8        | 9        |

有了这个,您可以使用唯一的选择来检索所需的数据,如下所示:

Select *
  From
(
   Select M.*,
          C.*,
          Null GWVR,
          Null Chassis,
          Null Truck_Body_Type
     From Master_Table M
     Left Join Car_Table C
       on M.WMI = C.WMI
   Union
   Select M.*,
          Null Veh_Line,
          Null Series,
          Null Car_Body_Type
          T.*
     From Master_Table M
     Left Join Truck_Table T
       on M.WMI = T.WMI
)

对于DML SQL,您只需要在插入或更新句子之前进行控制,无论您是拥有汽车还是卡车型号。

当然,您需要确保每个主排只有一个细节,无论是在汽车明细表上还是在卡车详细信息表上。

HTH

答案 1 :(得分:0)

为什么不为解码定义这两个规则;只有一个会解析有效的结果。