2015-06-09 25 views
0

我正在致力於一個簡單的資源預訂應用程序。該資源的使用是獨佔的,因此不能同時預訂多次。我想知道這個約束是否可以通過唯一索引來強制執行,而不必在代碼中構建驗證。時間間隔的獨特哈希/索引

資源只能按30分鐘的時間段預訂,開始和結束時間必須在小時或半小時。因此,預訂可以建模爲一組獨特的塊(將時間戳分爲30分鐘的塊)。

任何人都可以想到一種方法來散列,所以任何預訂與一個或多個30分鐘。共同的塊會違反獨特的索引條件嗎?

注:我使用MongoDB的(我不認爲這真的很重要)

+0

也許一個二維數組,你的第一維是一系列的天(從你的應用程序的時代),第二維是半小時的塊?我不確定你的應用程序的生命是什麼,或者只有特定的時間可以使用資源,這將顯着減少所需的空間。您也可以在某個時間間隔內拼接出舊數據。 –

回答

1

我想知道如果這種限制可以通過一個唯一索引強制執行,而不必在代碼來構建驗證。

在資源ID,天和大塊30分鐘內使用唯一的複合索引。然後每預約30分鐘插入一個文件。

例如,爲了從8:00預留資源ID 123 9 2015年6月至9:30(16 ,17 和18 30分鐘天的時間段),則插入文件:

> 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 
}, 

根據數EN項,你可以考慮使用嵌入文檔代替:

> 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以內。

+0

謝謝!要限制文檔的大小,我可以創建一個預訂集合,並在「預訂」文檔中包含嵌套塊。但是,我在文檔中看到,擁有不同大小的文檔可能是一個問題。預訂可能有1到48個街區(24小時)。你怎麼看? – znat

+0

@NathanZ知道你可以做到這一點並不意味着你應該做到這一點。圍繞這個想法有許多變化:例如,根據您的使用情況,您可能需要添加一個'reserved'布爾字段,並預先填充所有具有'reserved:false'的時間段 - 然後僅更新它在需要時變爲「真」。這將解決你的「不同大小的文件」問題。 –