«Имя» недвижимость в доктрине 2
-
27-09-2019 - |
Вопрос
Скажем, у меня есть система с продуктами, которые могут иметь различные варианты украшения (или печати).
Большинство продуктов будут иметь аналогичный диапазон названий параметров печати, но некоторые, может быть, уникальные для одного продукта.
Например, я мог бы иметь шапку, которая может иметь три разных варианта украшения:
- Непреднамеренный
- Один цвет печати
- Вышивка
Моя цель пытается минимизировать имена вариантов украшения, созданные пользователями Admin, поэтому они всегда одинаковы. Т.е. я не хочу, чтобы некоторые варианты украшений называются «1 цветная печать», а затем другой называемый «один цветной печать».
Таким образом, мой план находится в интерфейсе UI, состоит в том, чтобы выпадать имена существующих названий вариантов украшений, но также дайте им возможность добавить новую (для краевых чехлов).
Тем не менее, каждый вариант украшения имеет различные другие данные с ним, как стоимость установки, время производства и т. Д., Что варьируется в зависимости от продукта.
Например, Hat1 и Hat2 могут иметь вариант украшения вышивания, но стоимость установки Hat1 составляет $ 49 и стоимость установки Hat2 составляет всего 35 долларов.
Итак, мои вопросы, какой лучший способ структурировать мои сущности? Должен ли у меня три объекта: продукт, оформление и оформление? Или только два объекта: продукт и оформление?
Пожалуйста, смотрите моих примеров кода для дальнейшего понимания:
Решение
Я бы использовал три подхода сущности с некоторыми незначительными различиями в семантике: продукт, отделочные и продуктивные продукты. По сути, идея за столом соединения многих для многих к многим, но вы относитесь к объединению как свой объект, где вы можете хранить дополнительную информацию.
Товары и украшения являются их собственными отдельными объектами, а также информация о взаимосвязи между любым данным продуктом и любым данным декорацией управляется в продуктемере. Вы можете достичь этого, используя две оретоманистые отношения.
<?php
class Product
{
/** @OneToMany(targetEntity="ProductDecoration", mappedBy="product") */
private $productDecorations;
}
class Decoration
{
/** @Column(type="string") */
private $name;
/** @OneToMany(targetEntity="ProductDecoration", mappedBy="decoration") */
private $productDecorations;
}
class ProductDecorations
{
/** @ManyToOne(targetEntity="Product", inversedBy="productDecorations") */
private $product;
/** @ManyToOne(targetEntity="Decoration", inversedBy="productDecorations") */
private $decoration;
/** @Column(type="integer") */
private $setupCost;
/** @Column(type="integer") */
private $productionTime
}
Единственный способ, которым я бы порекомендовал использовать двух подходов на объект, заключается в том, что вы можете предвидеть, никогда не требуя большего, чем в столбце «Имя» для объекта декора, и вы не беспокоитесь о потенциальных проблемах нормализации базы данных.