Postgresql MATCH Частичная работа вокруг - PullRequest
0 голосов
/ 11 августа 2010

Я пытаюсь обойти отсутствие Postgresql 8.4 MATCH PARTIAL.У меня есть следующая схема:

[vehicles]
lot_id | vin | source | year | make | model ...
  primary key ( lot_id, vin, source )

[pictures]
picture_id | lot_id | vin | url | sha1 ...
  primary key ( picture_id )

Теперь мне нужна составная таблица FOREIGN KEY, которая REFERENCES vehicles, так что для ее существования требуются lot_id и vin.в таблице vehicles или ограничение целостности таблицы pictures не выполняется.Проблема в том, что эта функция доступна только в MATCH PARTIAL, которая не реализована.Есть ли другой способ легко получить этот эффект?До текущей итерации схемы в моей таблице транспортных средств были столбцы для каждого источника automated_make override_make vin_decode_make.Но, похоже, без MATCH PARTIAL мне придется сделать большее изменение, чем я изначально планировал.

Я думаю, мне придется оставить два составных indexes, чтобы достичь этого.

[index]
lot_id, vin
  primary key ( lot_id vin )

Возможно переименование [vehicles] в [sources] в процессе;и затем вынудив оба [vehicles] и [pictures] к MATCH FULL против этих PRIMARY KEY.

этой чрезмерной таблицы.

Ответы [ 3 ]

1 голос
/ 11 августа 2010

У вас возникла эта проблема, потому что у вас плохая модель данных.

A vehicle должен быть однозначно идентифицирован как vin (идентификационный номер транспортного средства). Идентификационные данные автомобиля не меняются в зависимости от того, в каком они лоте. И их изображение вряд ли изменится в зависимости от того, в каком именно лоте оно находится (если вас не волнует, например, «изображение этого Audi в лоте 4») .

Таким образом, фотографии должны иметь внешний ключ на транспортном средстве (вин), а не на транспортном средстве и партии.

Теперь, транспортное средство может быть в много, и, возможно, для вашей модели, оно должно быть много. Так что добавьте таблицу лотов и дайте машине ФК.

Укусил пулю и изменил модель, вместо того, чтобы тратить время, пытаясь приспособить плохую модель.

0 голосов
/ 11 августа 2010

Это плохая модель.Вы либо хотите соответствовать, либо нет.Целая частичная идея специально существует для борьбы с плохими моделями.Если у вас действительно нет другого выбора, напишите триггер.

0 голосов
/ 11 августа 2010

Я согласен с вашей идеей, что транспортные средства определяются не просто вином, а комбинацией вин и лота, поскольку это не физические транспортные средства.Лично я бы удалил источник из первичного ключа и разбил данные, специфичные для источника, на собственную таблицу.Таким образом, мы имеем:


[vehicles]
lot_id | vin
  primary key ( lot_id, vin )

[vehicle_data]
lot_id | vin | source | year | make | model ...
  primary key ( lot_id, vin, source )
  foreign key ( lot_id, vin ) references vehicles

[pictures]
picture_id | lot_id | vin | url | sha1 ...
  primary key ( picture_id )
  foreign key ( lot_id, vin ) references vehicles

Даже если вы вручную переопределите части описания, это все тот же автомобиль.

...