Как нормализовать / реорганизовать таблицы электронной торговли в Pocos, когда данные очень похожи на EAV - PullRequest
0 голосов
/ 24 марта 2010

В нашем приложении для электронной коммерции у нас есть различные виды продуктов с различными типами атрибутов, например, обувь имеет другие особенности продаж, чем съедобный торт. Наш сайт электронной коммерции позволяет вам «создавать» свои собственные продукты, выбирая различные атрибуты и значения (например, розовая глазурь на чашке для выпечки, которая добавляет к цене 0,25 доллара США).

Наша первая конструкция выглядела примерно так. Это ночник для поддержания. Я ищу предложения о том, как собрать эти таблицы (или объекты) более нормализованным и реалистичным способом.

У нас есть довольно стандартная таблица продуктов с большим количеством полей, чем эта, но вы поняли:

public class Product {
    public int      id     {get;set;}
    public string   name   {get;set;}
    public decimal  price  {get;set;}
}

У нас есть таблица параметров, в которой перечислены все параметры, которые можно выбрать для данной группы параметров (представьте себе один выпадающий список):

public class Options {
    public int      oId     {get;set;}
    public string   oName   {get;set;}
    public decimal  oPrice  {get;set;}  // Added to base price if selected
}

Тогда у нас есть таблица «многие ко многим», связывающая их обоих, где наличие записи связывает опцию с этим продуктом:

public class ProductOptions {
    public int     id       {get;set;}
    public string  oId      {get;set;}
}

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

Любые предложения будут наиболее цениться, особенно в DDD.

1 Ответ

2 голосов
/ 24 марта 2010

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

Таким образом, я бы добавил таблицу ProductGroup, добавил таблицу отношений ProductGroupOptions, чтобы вы могли применить опцию к ProductGroup, и таблицу отношений ProductGroupProduct, чтобы вы могли определить, какие продукты входят в какие группы продуктов.

например. Cake X входит в группу товаров «Торты», которые могут иметь вкус A, B, C

Возможно, вам также необходимо сгруппировать ProductOptions, чтобы можно было применить набор параметров продукта к ProductGroup или Product как к пакету.

например. Cake X является членом группы продуктов "Cakes", которая использует группу продуктов ProductOptionsGlavors "Flavors", которая включает в себя "A", "B", "C".

Вам нужно будет решить, разрешить ли также прямые негруппированные отношения между Продуктами и разновидностями или же на самом деле проще сказать, что все взаимодействия теперь происходят через группы, и если вам нужен один продукт -> Дополнительное соединение, вы просто создайте группу для каждого и примите, что у нее есть только один участник.

В общем, тогда у вас будет что-то вроде: -

Продукт принадлежит одной или нескольким группам продуктов

ProductOption принадлежит одной или нескольким группам ProductOption

ProductGroups имеет много-много связей с ProductOptionGroups

Так что в LINQ вы можете просто сделать что-то вроде Product.ProductGroups.SelectMany(gp => gp.ProductOptionGroups.SelectMany(pog => pog.ProductOptions)), чтобы получить все опции для данного продукта.

...