我正在开发一个简单的资源预订应用。资源的使用是独家的,因此不能同时预订多次。我想知道这个约束是否可以由唯一索引强制执行,而不必在代码中构建验证。
资源只能以30分钟的方式预订,而开始和结束时间必须是小时或半小时。因此,预订可以建模为一系列独特的块(将时间戳分成30分钟的块)。
任何人都可以想到一种方法来散列,所以任何一个或多个30分钟的预订。共同阻止会违反唯一索引条件吗?
注意:我使用的是MongoDB(我认为这不重要)
答案 0 :(得分:1)
我想知道这个约束是否可以由唯一索引强制执行,而不必在代码中构建验证。
在资源ID,日期和大块30分钟上使用唯一的复合索引。然后为每30分钟的预订时间插入一份文件。
例如,要在2015年6月9日从8:00到9:30(16 th ,17 th 和18 保留资源ID 123当天 30分钟),您插入 3 文件:
> db.booking.createIndex({resource: 1,
day: 1, period:1},{unique:true})
{
resource: 123,
day: ISODate("2015-09-06"),
period: 16
},
{
resource: 123,
day: ISODate("2015-09-06"),
period: 17
},
{
resource: 123,
day: ISODate("2015-09-06"),
period: 18
},
根据条目编号,您可以考虑使用嵌入式文档:
> db.resource.createIndex({_id: 1,
"booking.day": 1,
"booking:period":1},{unique:true})
并描述您的资源:
{
_id: 123,
someOtherResourceAttributes: "...",
booking: [
{
day: ISODate("2015-09-06"),
period: 16
},
{
day: ISODate("2015-09-06"),
period: 17
},
{
day: ISODate("2015-09-06"),
period: 18
},
]
},
这具有很大的优势,插入/更新对于整个预留是原子的。但要注意文档大小限制为16M。