sql - 车辆识别码(VIN)设计

标签 sql database-design

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

问题的要点在于,GM 根据卡车还是汽车对车辆属性部分(位置 4、5、6、7)的处理方式有所不同。详情如下:

通用汽车乘用车 VIN 明细

GM Car VIN

通用汽车车辆识别号明细

GM Truck VIN

通常,我所做的就是设计自己的粗略 ETL 流程,将数据导入 RDMBS - 每个表大致与主要 VIN 分割相关。例如,将有一个 WMI 表、EngineType 表、ModelYear 表、AssemblyPlant 表等。然后,我构造一个 View ,该 View 连接一些上下文数据,这些数据可能会或不会直接从 VIN 号码本身的字符代码中收集(例如,某些车辆类型仅具有某些车辆发动机)。

要查找 VIN,只需使用 VIN 字符串的每个主要字符代码位置分割查询 VIEW。例如,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对应于 body 风格

| 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 解码时返回一个通用结构 - 如果可能的话(即不返回汽车与卡车的不同结构)

最佳答案

根据您对我关于是否可以通过使用其他值来识别车辆类型的评论的回答,一种可能的方法可能是拥有一个包含公共(public)字段的主表和两个详细表,每个表都有相应的字段汽车或卡车。

大约如下所示(这里我猜测 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

关于sql - 车辆识别码(VIN)设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12994672/

相关文章:

mysql - 确保表条目是唯一的

php - 存储具有不同关键字的推文。单个大表,还是每个关键字一个表?

sql - Postgres日期问题

mysql - 为每个艺术家创建计数列或在查询中获取计数(计数关注者)

php - 主页加载时出现 PDO 错误

数据库设计 - 是否应将日期用作主键的一部分

database-design - 更新复合主键

sql - 如何删除给出单词以及开始和结束字符的表达式

sql - 在组 sqlite 中选择随机记录

ruby-on-rails - rails : dynamic columns/attributes on models?