Простая реляционная база данных между Sales и Item

Я создаю простую систему точек продаж для своего проекта. В этой системе есть таблица с именем Sales и другая таблица с именем Item. В таблице Item будет столбец с именем itemcode, который является первичным ключом. В таблице Sales будет столбец с именем itemcode, который является внешним ключом, ссылающимся на itemcode в таблице Item.

Проблема в том, должен ли я сделать код товара в таблице «Продажи» внешним ключом, ссылающимся на код товара в таблице «Товары»?

Если это внешний ключ, я не могу удалить конкретный элемент из таблицы Item, если по этому конкретному элементу были продажи. Это связано с тем, что в таблице Sales есть внешний ключ, ссылающийся на первичный ключ в таблице Item.

Если это НЕ внешний ключ, код элемента не обновляется, когда я обновляю код элемента в таблице элементов.

Любые советы по решению этой проблемы?


person Boon    schedule 18.06.2012    source источник


Ответы (2)


Если ваш код элемента будет меняться для данного элемента в течение его жизни в вашей базе данных, то он не является хорошим кандидатом на роль первичного ключа. В этих обстоятельствах мы обычно генерируем автоматически увеличивающиеся и соответственно произвольные идентификаторы для использования в качестве первичных ключей, а затем используем их во взаимоотношениях внешнего ключа. У вас есть торт и съесть его тоже ... это просто стоит еще один хорошо проиндексированный и эффективный столбец. :-)

person Chris Trahey    schedule 18.06.2012
comment
Спасибо, но как мне удалить товар из таблицы Item, если этот товар больше недоступен, но все равно нужно вести записи в таблице продаж? - person Boon; 18.06.2012
comment
Чтобы правильно его смоделировать, вы можете сделать одну из двух вещей; либо отслеживать инвентарь отдельно, либо добавить столбец в таблицу товаров, который указывает доступность, и использовать этот столбец везде, где вы показываете товары на сайте (т. е. WHERE items.currently_available = TRUE) - person Chris Trahey; 18.06.2012
comment
Спасибо, я попробую. - person Boon; 18.06.2012

Вы можете использовать entity_id в качестве первичного ключа таблицы элементов, и на него будет ссылаться таблица продаж. Код товара будет другим столбцом только в таблице товаров.

person Sashi Kant    schedule 18.06.2012
comment
Спасибо, но как мне удалить товар из таблицы Item, если этот товар больше недоступен, но все равно нужно вести записи в таблице продаж? - person Boon; 18.06.2012
comment
почему бы вам не добавить количество столбца в таблицу товаров, всякий раз, когда товар продается, значение количества уменьшается на 1. Если у вас нет товара на складе, поле количества будет иметь значение 0. верните меня обратно в случае каких-либо сомневаться - person Sashi Kant; 18.06.2012