4

我知道它已經被告知幾乎與RDBS中的時間表建模相關的任何事情,但是我找不到任何關於可用技術來將時間表存儲在數據庫中的文檔。關係數據庫中的時間表建模

我的情況:

  • 我有表女巫擁有可用的地方,並表實際的類。
  • 每個地方都有它自己獨特的時間表
  • 每個類都可以在任何地方進行調度,任何時間,除了少數例外:
    • 一類可以採取一個時隙(例如:如果A類計劃在P1的12:00到達1小時的時間,下一次出現的A級只能在12:00之前或13:00之後,在任何地方,女巫有空閒的時間段;禁止一次性安排A班在兩個地方)
    • 在一個地方,它可以是一個類時隙
  • S型應該支持預定類別的版本控制/歷史記錄

現在,我該如何在SQL DB中表示這個數據模型?

我不是找現成使用​​精確的架構,而我會很高興,如果任何人都可以寫獲得的建模技術和他們的比較,巫婆我可以用它來解決這個任務

例如:對於樹形結構/分層數據,有很好的文檔「修改前序樹遍歷算法」,是否有一些類似的算法/技術來處理時隙?

回答

1

時間表是一個矩陣。在左邊我們有LOCATIONS。在頂部我們有TIMESLOTS。 LOCATION和TIMESLOT的任何給定置換的交集都是一個帶有CLASS或null的單元格。

爲了建模,我們需要一個LOCATIONS表(實體),它是非常固定的數據。我們需要一張TIMESLOTS(日期/時間)表,它不斷增長。我們需要一個CLASSES表,它也是非常固定的。最後,我們需要一個交叉表CLASS_TIMESLOT_LOCATIONS。這是魔術發生的地方。該表有三個外鍵,一個是CLASSES,一個是LOCATIONS,一個是TIMESLOTS。它的主鍵是(LOCATION_ID,TIMESLOT_ID),但它也需要一個唯一的約束(CLASS_ID,TIMESLOT_ID)。


你問一個造型的問題,但也有一對夫婦的實施細節,你需要思考的問題。他們不會調用邏輯模型,但會影響您如何使用物理表。首先考慮的是是否產生所有潛在的TIMESLOTS,如果是,則存儲多大的窗口。第二個是是否爲交叉表CLASS_TIMESLOT_LOCATIONS存儲空條目。

這裏沒有直截了當的答案:有些數據庫產品比其他數據庫產品更容易「填補空白」。另外,動態生成缺席記錄可能會造成太多的性能下降,在這種情況下,磁盤空間是一個很好的折衷。


至於存儲歷史,這大概是爲了存儲對時間表的更改。使用單獨的表格填充觸發器(您可以使用存儲過程,但觸發器是行業標準)。不要試圖將歷史存儲在主表中。它打破了規範化的模式,並導致各種悲傷。

+0

我加入實現細節,因爲我無法解釋我的英文正確的意思),所以我說這對於我是什麼意思一個更好的「線索」。 – canni 2010-10-12 13:09:55

+0

@DariuzGorecki - 對不起,我沒有指責你。我只是說爲什麼我添加了一些我自己的附加信息。 – APC 2010-10-12 13:15:15

0

從我在你的問題中看到的看起來你有幾個約束你想在數據庫端處理。

•我有一張桌子,裏面有可用的地方,桌子上有實際的課程。

更可以在表的設計加以闡述,但這只是需要一個表架構抱着你需要

•每個地方的信息有它自己獨特的時間表

如何在插入創建觸發器確保插入到計劃中的課程與其他課程計劃沒有衝突?

•每個班級都可以安排在任何地點和任何時間,但很少例外: •一個班級可能需要一個時間段(例如:如果班級A在12:00安排在P1時間爲1小時,下一次出現的A級只能在12:00之前或13:00之後放置,在任何地方女巫都有空閒時隙;禁止一次性在兩個地方安排A級)

我會處理的觸發也

•這個約束在一個地方它可以是一個類時隙

有這在觸發

處理約束•模型應該支持計劃類的版本/歷史

有一個單獨的表,反映的是你有一個時間表實際的表。當新記錄被插入到主表格中時,您可以觸發更新和時間更新/插入/刪除到具有歷史記錄的表格

希望這可以幫助您瞭解一些想法。

-Vijay