Entity framework 实体框架代码优先-包含产品和产品选项的目录的数据库架构

Entity framework 实体框架代码优先-包含产品和产品选项的目录的数据库架构,entity-framework,database-design,database-schema,code-first,entity-framework-migrations,Entity Framework,Database Design,Database Schema,Code First,Entity Framework Migrations,我正在尝试创建一个没有使用任何第三方组件的电子商务网站 到目前为止,我最大的问题是设计模型/数据库模式 电子商务解决方案是外卖的 他们只卖两种类型的饭菜 米饭 面条餐 现在米饭有一系列的选择,例如,米饭既有豆类,也有芭蕉,或者两者都有。(如果双方都需要抵消价格) 米饭还配有酱汁。顾客有3种不同的选择。没有价格差异 面食 你可以选择一种面条 你可以选择一种与之配套的酱汁。 你可以选择吃鱼还是肉 然后他们有其他没有任何选择的产品 所以我的问题是如何创建一个灵活的模式来存储产品、它们拥有的选项以及这些

我正在尝试创建一个没有使用任何第三方组件的电子商务网站

到目前为止,我最大的问题是设计模型/数据库模式

电子商务解决方案是外卖的

他们只卖两种类型的饭菜

  • 米饭
  • 面条餐
  • 现在米饭有一系列的选择,例如,米饭既有豆类,也有芭蕉,或者两者都有。(如果双方都需要抵消价格)

    米饭还配有酱汁。顾客有3种不同的选择。没有价格差异

    面食

    你可以选择一种面条 你可以选择一种与之配套的酱汁。 你可以选择吃鱼还是肉

    然后他们有其他没有任何选择的产品

    所以我的问题是如何创建一个灵活的模式来存储产品、它们拥有的选项以及这些选项的可能值

    我还需要解决如何存储用户实际选择的内容

    我正在使用EF的代码第一,希望有人给我一些提示,在正确的方向

    我遇到的最接近解决方案就是这个


    我真的不知道最好的方法是什么。

    根据您提供的链接,类似的方法可能会奏效:

    MealType
    - MealTypeID (short maybe? identity, PK)
    - Name
    
    Meal
    - MealID (long, identity, PK)
    - MealTypeID (FK)
    - Name
    - BasePrice
    - IsActive (bit)
    
    MealOption
    - MealOptionID (PK) (short or int, identity)
    - Name
    - PriceOffset
    - IsActive (bit)
    
    MealMealOption (not the best name, but just represents a relationship between Meals and MealOptions)
    - MealMealOptionID (PK, int or long, identity)
    (composite foreign key with MealID and MealOptionID)
    - MealID
    - MealOptionID
    
    Order
    - (this holds stuff common to all orders such as billing address info, messages from the customer, etc.)
    - OrderID (long, identity, PK)
    - TotalCost
    - TotalPriceOffset
    etc...
    
    OrderItems
    - OrderItemsID (long, identity, PK)
    - OrderId (FK)
    - MealID (FK)
    other order item-specific stuff...
    
    OrderOptions
    - OrderOptionID (long, identity, PK)
    - OrderItemsID (FK)
    - OrderID (FK)
    - MealMealOptionID (FK)
    anything else needed here...
    

    显然,任何表都会包含您认为该表所需的任何其他字段。

    此问题的答案在这里>

    这是一个edr图,展示了如何存储:N个设置,与N个用户关联,每个用户可以有N个与该单个用户关联的设置。因此,一个用户可以有5个设置,另一个用户可以有10个设置

    这是非常灵活的,我将在未来使用它。我已交换实体用户,并将其替换为产品

    我现在想知道的是如何存储选定的设置?这些表只能存储和显示用户设置和可用选项/设置

    有什么想法吗

    保持简单! 建模是一项技能。它是关于观察和过滤的。即使是在外卖这样相对简单的业务中,也存在大量噪音,如果您设法过滤噪音并保持本质,您的实体模型将变得既健壮又灵活。首先关注绝对最小值。让我试着向你展示一下这在你的情况下是如何起作用的

    过滤首先要找到“无处不在”的语言(Evans,域驱动设计):业务所谈论的、可能成为模型中实体的“事物”

    你谈论食物、种类、价值、价格、折扣、选择、产品。什么是候选实体

    要采取的一个重要步骤是找到真实、有形的“东西”。顾客没有吃的选择。他们吃食物或产品。他们也不吃价格

    “选项”是一个有趣的词。它是一个隐蔽动词。这是一种选择某种“东西”的行为。将动作转换为实体是建模中常见的设计缺陷,而它们应该成为处理实体的方法。找到这些伪装的动词是非常重要的。在不深入探讨这个问题的情况下,我可以说,作为实体的操作很难为类分配正确的职责

    同样,价格(价值)和类型也不是有形的东西。它们是事物的属性。将属性转换为实体是一个不太明显的错误,但它确实发生了。我认为您作为示例展示的模型包含上述两个缺陷

    事实上,到目前为止,唯一真正出现的“东西”是
    产品
    。剩下的要么是动作,要么是属性。
    产品
    既可以是一餐,也可以是一餐的组成部分。因此,这些产品以组合或聚合的形式出现,可以通过层次结构进行建模

    下面是“存储产品的灵活模式”的核心:

    您可以将所有可能的产品组合存储在一个数据库表中。不需要单独存储选项。选择也是产品。这是在产品层次结构中设计选项的一种组合行为

    层次结构的一个具体部分,即米饭,可以如下所示:

    业务进行合并,即设计层次结构。客户进行选项选择。这里业务规则开始发挥作用。假设一条规则是所有者可以组合任何产品,另一条规则是客户只能组合端点(较小的灰色矩形)。父产品可以包含一个属性,说明可以选择多少子产品

    有一种方法可以将这些规则构建到模型中,但是编码规则比模型更容易修改。
    。让模型只是一个愚蠢的数据包

    现在角色

    我还需要解决如何存储用户实际选择的内容

    当客户选择选项时,他正在使用订单行进行经典订单。那将是一个像这样的模型


    这是一个很长的答案。简单介绍一下折扣。这取决于你想如何计算它们。一个简单的方法是一个产品属性,它只是一个乘法因子,当选择多个产品时,应用于每个子产品的价格。

    看看这样的情况:它是用于用户选项,但将
    用户
    更改为
    膳食
    ,这与您正在寻找的是同一种东西。需要什么样的价格补偿?需要如何使用该选项?@bcr如果选择该选项,我们可以在meal@JoelBrown非常感谢你这正是我所需要的我已经准备好了。。。写一个答案?@user2537315-不客气。如果你喜欢另一个a