управление версионными данными в MySQL - PullRequest
0 голосов
/ 07 июня 2018

Допустим, у меня есть следующие таблицы:

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

По сути, у меня есть шаблон типа записи / свойства, на котором я пытаюсь управлять версиями.

Как я могузапросить это, чтобы всегда получать последнюю утвержденную версию автомобиля со всеми его свойствами?Обратите внимание, что некоторые свойства могут не обновляться в конкретной версии.то есть: в приведенном ниже примере утвержденная версия carid: 1 - это

Honda AccordEX color:green doors:4

Некоторые данные, поступающие с V3, и другие данные, поступающие с V1.

Звучит так, как будторазработан шаблон для управления этим типом данных.Кто-нибудь может указать мне правильное направление?

1 Ответ

0 голосов
/ 08 июня 2018

Я думаю, что это:

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;

будет работать, довольно хорошо, но это, честно говоря, не ясно.

Тем не менее, ваша модель данных откровенно странная.У вас есть строки с одинаковым идентификатором, но меняющими свойствами (почему в CarProperties нет make и model?).

Ваша таблица CarProperties является (в некотором роде) EAV, но имеет дублированное поле версии, которое, по-видимому, не требуется.

Я думаю, вам действительно нужно пересмотреть свою модель данных и нормализовать ее немного больше.

...