【发布时间】:2023-02-23 06:46:26
【问题描述】:
假设我有两个实体:Company 和Product。
它们具有以下属性。
| Company | Product |
|---|---|
| Id | Id |
| Name | Name |
| MarketCap | Category |
| Geography | Price |
以下是一些额外的事实:
- 一家公司有数百万种产品。
- 产品离不开公司。
我要支持的核心端点是:
- 获取特定类别的所有产品(不需要公司信息)
- 获取所有公司(不需要产品信息)
- 获取一家公司的所有产品
- 获取一个产品类别的所有公司
我可以像这样模拟实体的关系:
方法一
// Company
type Company struct {
Id int
Name string
MarketCap int
Geography string
ProductIds []int
}
// Product
type Product struct {
Id int
Name int
Category string
Price int
CompanyId int
}
或者我可以将其建模如下:
方法二
// Company
type Company struct {
Id int
Name string
MarketCap int
Geography string
Products []Product
}
// Product
type Product struct {
Id int
Name int
Category string
Price int
Company Company
}
正如reddit post 中所讨论的那样,方法 2 在某种意义上更多地遵循 DDD 的哲学,即领域模型不应该关心存储实现细节。但是,如果我查看我将如何使用我的 api 端点中的数据,我就会意识到某些端点将变得多么低效。
假设我遵循方法 2 并有一个端点 Get list of all companies。
为了重新创建公司实体,我必须在公司和产品表之间进行连接。每个公司对象将包含数百万种产品。当然,我不会在最终的 API 响应中添加每个公司的所有产品,但我至少需要从数据库中获取所有产品以创建一个有效的公司实体对象。如果我遵循方法 1,我就不必执行连接操作,因为通过单独的连接表(companyID、productID)获取 ProductIds 更便宜。
问题
我什么时候应该只用 id 建模一对多或多对多关系,什么时候应该在域层上用嵌套层次结构建模?
【问题讨论】: