时间间隔的唯一哈希/索引

时间:2015-06-09 14:22:13

标签: mongodb database-design hash database

我正在开发一个简单的资源预订应用。资源的使用是独家的,因此不能同时预订多次。我想知道这个约束是否可以由唯一索引强制执行,而不必在代码中构建验证。

资源只能以30分钟的方式预订,而开始和结束时间必须是小时或半小时。因此,预订可以建模为一系列独特的块(将时间戳分成30分钟的块)。

任何人都可以想到一种方法来散列,所以任何一个或多个30分钟的预订。共同阻止会违反唯一索引条件吗?

注意:我使用的是MongoDB(我认为这不重要)

1 个答案:

答案 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。