数据库设计问题:存储多种类型的价格

时间:2016-01-29 17:54:44

标签: mongodb mongoose mongodb-query

我在MongoDB上为一个网站设计一个数据库,那里有很多活动。

每个活动都有基本的详细信息,例如titledescriptionreviews等。 除此之外,每个活动每天都有不同的套餐和预订价格。因此,User可以针对特定套餐为特定日期预订Event

我脑子里有很多解决方案,但不确定要去哪一个。 起初,我想出了以下[选项1]:

Event.schema({
    title: String,
    description: String,
    reviews: [ { userId: mongoose.Types.ObjectId, comment: String, rating: Number } ],
    prices: [ { packageName: String, date: Date, price: Number } ]
});

但是有一个问题。如果我想更改包名,我必须在所有数组元素中进行。

我试图通过这个做得更好:

Event.schema({
    title: String,
    description: String,
    reviews: [ { userId: mongoose.Types.ObjectId, comment: String, rating: Number } ],
    packages: [ String ],
    prices: [ { packageId: Number, date: Date, price: Number } ]
});

此处,packageId将是packages数组中特定包名称的位置。这似乎也不对。我不知道为什么。 [让我知道这是一个不错的选择]

我能想到的第三个选项是将每个包的定价保存在单独的文档中:

Event.schema({
    title: String,
    description: String,
    reviews: [ { userId: mongoose.Types.ObjectId, comment: String, rating: Number } ]
});

Package.schema({
    eventId: { type: mongoose.Types.ObjectId, ref: 'Event' },
    title: String,
    pricing: [ { date: Date, price: Number } ]
});

或者不是将eventId保留在Package模型中,我应该在Package模型中保留一组Event个ID吗?

在所有选项中,哪一个是最佳解决方案?或者如何改进,请记住我还会在我的网站上添加Search by price过滤器功能。所以我现在必须非常小心地决定架构。

1 个答案:

答案 0 :(得分:1)

我认为你的第一个选择是好的,除非你想经常更改包名(可能不是这种情况)。

这是最佳选择的主要原因是因为您希望按价格搜索事件。将所有信息放在单个文档中将更有效。

您可以在MongoDB documentation

中找到更多信息