Как я могу реализовать таблицу базы данных (ER), в которой значения внешнего ключа зависят от другого внешнего ключа в той же таблице?

#mysql #django #database-design #e-commerce #entity-attribute-value

Вопрос:

Пожалуйста, поделитесь со мной, так как я новичок в разработке баз данных. Я пытаюсь создать магазин электронной коммерции в Django с вариантами продуктов, как показано на прилагаемом изображении.

Для модели/таблицы ProductVariations я хотел бы иметь внешний ключ для параметров (который представлял бы что-то вроде размера), а затем на основе этого внешнего ключа я хотел бы иметь другой внешний ключ для значений параметров (например, маленький). Возможные значения для последнего внешнего ключа должны быть ограничены первым внешним ключом. Более конкретно, я не хочу, чтобы в раскрывающемся списке на сайте администратора отображалось «маленький, красный, синий, 32, 33, большой», когда предыдущий внешний ключ был «размер». В этом случае я бы хотел, чтобы он отображал только «маленький, большой».

Как мне это сделать? Я был бы признателен за любые идеи, относящиеся либо к Django, либо просто к дизайну базы данных в целом.

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

Комментарии:

1. Не разделяйся Option и OptionValue . Прочитайте о EAV (Значение атрибута сущности); у него много проблем; вы также можете прочитать о том, как начали другие.

2. Спасибо, Рик! Я прочитаю о подслушивании прямо сейчас. Мои размышления о разделении этих двух состояли в том, что я хотел бы создать ограничение таким образом, чтобы пользователь не добавлял 2 размера к одному и тому же варианту продукта, но мог добавить опцию размера и другой цвет. Поэтому я надеялся, что наличие unique=True в опции для размера предотвратит это, т. Е. Если бы существовала только одна сущность с записями «размер: маленький», «размер: большой», «цвет: красный», тогда им могло бы сойти с рук добавление двух размеров.