在mysql中管理版本数据

3duebb1j  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(335)

假设我有以下表格:

Cars
--------
ID  Make    Model       Version 
1   Honda   Accord      v1
2   Honda   Civic       v1
3   Honda   Odysey      v1
1   Honda   AccordLX    v2
1   Honda   AccordEX    v3

CarProperties
-------------
CarID   key value   Version
1   color   red v1
1   doors   4   v1
2   color   blue    v1
2   doors   2   v1
3   color   black   v1
1   color   blue    v2
1   color   green   v3

Versions
-----------
ID  Status
v1  Approved
v2  Pending
v3  Approved

基本上,我有一个条目/属性类型模式,我正在尝试对其进行版本管理。
如何查询此项以始终获得具有所有属性的最新批准版本的汽车?请注意,某些属性可能不会在特定版本中更新。ie:在下面的示例中carid:1 is

Honda AccordEX color:green doors:4

有些数据来自v3,有些数据来自v1。
这听起来像是有一个完善的模式来管理这类数据。有人能给我指一下正确的方向吗?

polkgigr

polkgigr1#

我认为:

WITH car_version_latest AS (
     SELECT c.*, ROW_NUMBER() OVER (PARTITION BY (c.ID, c.Make, c.Model) ORDER BY c.Version DESC) AS rn
     FROM Cars AS c
     )

SELECT * FROM car_version_latest cvl
WHERE cvl.rn = 1;

会起作用,相当不错,但坦率地说还不清楚。
也就是说,你的数据模型很奇怪。您的行具有相同的id,但属性正在更改(为什么在CarProperty中没有make和model?)。
您的carproperty表是(某种)eav,但是有一个显然不需要的复制版本字段。
我认为您真的需要修改您的数据模型并将其规范化一点。

相关问题