0

我需要一些关于建模电子商务域的建议。

客户销售两种产品:

  1. 定制艺术品,客户指定的设计。
  2. 客户指定的背面带有信息的艺术版画。

到目前为止,这是我缩减的数据库模型。

Products:
    Id
    Description
    Price

Orderlines:
    Id
    OrderId
    ProductId

Attributes:
    Id
    Name

OrderAttributes:
    AttributeId
    OrderlineId
    Value

产品表将包含上面的 2 个产品。

订单行将所选产品链接到订单。

属性包含每个产品的自定义字段名称。

例如,定制艺术品产品将具有属性设计。

订单属性将订购的产品链接到其海关属性并具有价值。例如,具有设计属性的定制艺术品产品,具有油漆房屋的价值。

我还想使用 nhibernate 将此数据库模型映射到代码。

有没有更好的方法来建模这些数据?

4

2 回答 2

2

几个建议:

Orderlines 表应包含产品的价格(可能还有描述),以便项目价格可以更改而不会影响现有订单。同样,订单表(未显示)应包含可能更改的客户信息(例如送货地址)。构成订单的数据不能更改,最简单的方法是将其展平和非规范化。

OrderAttributes 结构被称为实体-属性-值模型,它有很多缺点。一般来说,我建议避免使用它并将所需的列添加到 Orderlines 表中。如果需要,您的应用程序可以继承 Product 和 OrderLine,以便 CustomArtWorkProduct 在添加到订单时创建 CustomArtWorkOrderLine。

于 2013-01-16T15:02:10.203 回答
0

在面向对象的程序中,关系表示为关联。

那是:

  • 如果产品有订单,那么产品必须有一个订单集合。
  • 如果订单是针对产品的,则订单必须具有属性 Product。
  • 等等。

在面向对象的编程中,您不需要通过标识符关联:您不需要它,因为这是一个由分层数据统治的不同世界。

老实说,如果你按照我之前所说的去做,NHibernate 将是一个非常强大的工具,因为它能够在没有你干预的情况下加载对象和属性。

想想“获得某个产品的所有订单”:您不会有意执行 SQL 连接,但您将访问 的Orders属性,ProductNHibernate 会将这种访问转换为数据库世界

这就是使用 OR/M 的意义所在。这不仅仅是“我按原样映射表”。它是关于连接两个截然不同的世界:面向对象的分层世界,没有痛苦的关系数据。

查看这篇非常古老的(2004 年!)CodeProject 文章以及它如何创建基于 Northwind SQL Server 数据库的模型:

不要关注如何将模型映射到数据库,而是关注模型设计。

查看这篇文章,它比另一篇更现代:

于 2013-01-16T09:22:22.467 回答