提问人:Bernardo Benini Fantin 提问时间:9/13/2023 更新时间:11/18/2023 访问量:33
如何使用购物车产品对象构建购物车
How to structure a cart with cart products object
问:
我是 DDD 的新手,在构建对象时遇到困难。我有一个 ,我可以在其中添加它。每个都有一些属性,如图像、标题、价格等。每当将 添加到 中时,数据库就会将此关系存储在一个名为 的单独表中。这个新表允许我向 添加一些新属性,例如观察,它的 ID 与表中的 ID 不同,它可以有额外的属性,例如“fries for a cheeseburguer”等。因此,如果我正在处理一个对象,该对象具有(来自表),我应该有一个 ,这将是一个数组,其中每个将是一个 ,带有一个 id、observation 和一个具有产品所有属性的属性,如图像、标题、价格,或者我可以直接在我的产品中拥有所有这些属性?基本上。cart
products
product
product
cart
cart_products
cart product
product
products
cart
products
cart_products
cart.products
products
product
cart_product
product
cart = {
products = [ // this product comes from `cart_products` table
id = 1
observation = 'text text text'
product = { // this product comes from `products` table
image: 'url'
name: 'Cheese'
price: 2.0
}
]
}
或
cart = {
products = [ // this product comes from `cart_products` table
id = 1
observation = 'text text text'
image: 'url' // this property comes from `products` table
name: 'Cheese' // this property comes from `products` table
price: 2.0 // this property comes from `products` table
]
}
使用无处不在的语言的想法,似乎第二种更适合,但我不知道它是否正确(或者,至少,更有意义)
答:
我认为你需要重新定义你的.这不仅仅是一个连接其他两个表的表,而是具有真正的价值。这样做将帮助您更轻松地考虑数据结构。cart_products
您的对象可以具有以下定义和职责:
- 购物车 - 包含用户选择的所有产品,还需要字段来标识它与哪个用户相关联等。这是 DDD 方法中的聚合根。
- CartLineItem - 指用户想要购买的产品快照以及一些补充信息。仅当与购物车关联时才能存在。
- 产品 - 从购物车的角度来看,这本质上是参考数据。管理产品是一项后台任务,而管理购物车是由用户驱动的。这是一个提示,它应该是一个完全独立的域,并且是它自己的聚合根。
考虑到这一点,您最终会得到两个完全独立的对象层次结构:
cart = {
userId = 4,
// more properties
lines = [
productId = 1,
name = "Cheese",
unitPrice = 2.0,
quantity = 5,
discountPercent = 20
total price = 8.0,
observation = "bla bla bla"
]
}
product = {
id = 1,
image = "URL",
name = "Cheese"
price = 2.0,
description = "Tasty cheese"
}
我添加了一些额外的属性,希望能说明为什么尽管购物车行项代表产品,但它本身就值得成为一流的对象。
您可以将一些相关字段复制到行项中,以便于访问,就像我对名称和价格所做的那样,因为您将在将产品添加到购物车时获得产品的快照。这些字段很可能是购物车摘要页面上显示的字段,等等。您绝对不需要将产品描述等字段复制到购物车中,并且拥有一个完全独立的产品域可以让您将其隔离。
评论