我正在致力於一個簡單的資源預訂應用程序。該資源的使用是獨佔的,因此不能同時預訂多次。我想知道這個約束是否可以通過唯一索引來強制執行,而不必在代碼中構建驗證。時間間隔的獨特哈希/索引
資源只能按30分鐘的時間段預訂,開始和結束時間必須在小時或半小時。因此,預訂可以建模爲一組獨特的塊(將時間戳分爲30分鐘的塊)。
任何人都可以想到一種方法來散列,所以任何預訂與一個或多個30分鐘。共同的塊會違反獨特的索引條件嗎?
注:我使用MongoDB的(我不認爲這真的很重要)
我正在致力於一個簡單的資源預訂應用程序。該資源的使用是獨佔的,因此不能同時預訂多次。我想知道這個約束是否可以通過唯一索引來強制執行,而不必在代碼中構建驗證。時間間隔的獨特哈希/索引
資源只能按30分鐘的時間段預訂,開始和結束時間必須在小時或半小時。因此,預訂可以建模爲一組獨特的塊(將時間戳分爲30分鐘的塊)。
任何人都可以想到一種方法來散列,所以任何預訂與一個或多個30分鐘。共同的塊會違反獨特的索引條件嗎?
注:我使用MongoDB的(我不認爲這真的很重要)
我想知道如果這種限制可以通過一個唯一索引強制執行,而不必在代碼來構建驗證。
在資源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以內。
謝謝!要限制文檔的大小,我可以創建一個預訂集合,並在「預訂」文檔中包含嵌套塊。但是,我在文檔中看到,擁有不同大小的文檔可能是一個問題。預訂可能有1到48個街區(24小時)。你怎麼看? – znat
@NathanZ知道你可以做到這一點並不意味着你應該做到這一點。圍繞這個想法有許多變化:例如,根據您的使用情況,您可能需要添加一個'reserved'布爾字段,並預先填充所有具有'reserved:false'的時間段 - 然後僅更新它在需要時變爲「真」。這將解決你的「不同大小的文件」問題。 –
也許一個二維數組,你的第一維是一系列的天(從你的應用程序的時代),第二維是半小時的塊?我不確定你的應用程序的生命是什麼,或者只有特定的時間可以使用資源,這將顯着減少所需的空間。您也可以在某個時間間隔內拼接出舊數據。 –