Это хорошее решение для обеспечения целостности данных в этой конкретной ситуации? - PullRequest
0 голосов
/ 06 марта 2011

Я работаю над приложением, которое отслеживает цены на определенные товары.

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

CREATE TABLE `price` (
  `priceId` INT UNSIGNED NOT NULL AUTO_INCREMENT, -- PK
  `businessId` INT UNSIGNED NOT NULL,
  `itemId` INT UNSIGNED NOT NULL,
  `locationId` INT UNSIGNED NOT NULL,
  `figure` DECIMAL(19,2) UNSIGNED NOT NULL,
  -- ...
)

Но у меня есть следующая проблема:

Логика приложения такова, что один элемент в одном предприятии в одном месте может иметь несколько цен(на данный момент не очень важно, почему), и одна из этих цен может быть официальной ценой - предмет не должен иметь официальную цену, но если это так, то может быть только одна.

Вопрос ;Как смоделировать это для обеспечения целостности данных?

Моя первоначальная идея состояла в том, чтобы создать дополнительную таблицу:

CREATE TABLE `official_price` (
  `priceId` INT UNSIGNED NOT NULL -- PK + FK (references price.priceId),
  -- ...
)

Эта таблица будет содержать priceId: s для официальных цен, а ограничение PK / UNIQUE позаботится о «одно или-none 'ограничение.

Это похоже на работоспособное решение, но мне все еще интересно, есть ли лучший способ справиться с этой ситуацией?

Ответы [ 2 ]

0 голосов
/ 06 марта 2011

Вы можете сделать так, чтобы в таблице price содержались только официальные цены (с цифрой, возможно, равной нулю), наложить уникальное ограничение на (businessId, itemId, locationId) и добавить еще одну таблицу ссылок на вспомогательные цены. priceId.

0 голосов
/ 06 марта 2011

Вы можете использовать этот грязный хак:

  1. добавить поле is_official в price таблицу, в нем возможно значение null
  2. создать уникальный составной индекс priceId + is_official
  3. по официальным ценам: 1 до is_official
  4. для неофициальных осталось это null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...