我想要決定一個數據庫設計。更具體地說,這是更大設計的一個子部分。基本上,有「位置」 - 每個位置可以有任何數量的傳感器與它相關聯,它可以有一個記錄器(但只有1個)。數據庫「超級」對比更多的表vs普通表
我有傳感器讀數,我有記錄器讀數,每個不同,我認爲需要單獨的表格。
如果傳感器讀數超出範圍,則會生成警報。雖然傳感器讀數超出範圍,但他們仍然與該警報關聯,因此您最終會收到1條包含許多讀數的警報,以便稍後繪製警報,以便我可以發現趨勢等。
與記錄儀讀數相同。
這裏是我的想法3到目前爲止,用於存儲這樣的數據:
選項1:
Location [Table] - Id [PK] - Name - HasLogger LiveSensor [Table] - LocationId [FK] - Id [PK] LiveSensorReading [Table] - Id [PK] - SensorId [FK] - Value LiveSensorAlert [Table] - Id [PK] - SensorReadingId [FK] (may not be needed - enforces need to always have at least 1 reading) LiveSensorAlertCorrectiveAction [Table] - LiveSensorAlertId [FK] - CorrectiveActionId [FK] - ByUserId [FK] LiveSensorAlertAcknowledgement [Table] - LiveSensorAlertId [FK] - ByUserID [FK] LiveSensorAlertReading [Table] - SensorAlertId [FK] - SensorReadingId [FK] LoggerReading [Table] - LocationId [FK] - Value LoggerAlert [Table] - Id [PK] - LoggerReadingId [FK] (may not be needed - enforces need to always have at least 1 reading) LoggerAlertReading [Table] - LoggerAlertId [FK] - LoggerReadingId [FK] LoggerAlertCorrectiveAction [Table] - LoggerAlertId [FK] - CorrectiveActionId [FK] - ByUserId [FK] LoggerAlertAcknowledgement [Table] - LoggerAlertId [FK] - ByUserID [FK]
- 問題:重複表的地段(這個真的還重要,雖然??)
選項2:
Location [Table] - Id - Name - HasLogger Sensor [Table] - Id [PK] - LocationId [FK] SensorReading [Table] - Id [PK] - SensorId [FK] - Value LoggerReading - LocationId [FK] - Value Alert [Table] - Id [PK] AlertCorrectiveAction [Table] - AlertId [FK] - CorrectiveActionId [FK] - ByUserId [FK] AlertAcknowledgement [Table] - AlertId [FK] - ByUserId [FK] SensorAlertReading - AlertId [FK] - SensorReadingId [FK] LoggerAlertReading - AlertId [FK] - LoggerReadingId [FK]
- 問題:不強制規則 「至少1 每個警報讀書」。
- 問題:允許多個類型的 讀取引用相同的警報。
選項3:
Location [Table] - Id - Name - HasLogger Sensor [Table] - Id [PK] - LocationId [FK] SensorReading [Table] - Id [PK] - SensorId [FK] - Value LoggerReading - LocationId [FK] - Value Alert [Table] "super table" - Id [PK] LoggerAlert [Table] - AlertId [PK, FK] - LoggerReadingId [FK] SensorAlert [Table] - AlertId [PK, FK] - SensorReadingId [FK] AlertCorrectiveAction [Table] - AlertId [FK] - CorrectiveActionId [FK] - ByUserId [FK] AlertAcknowledgement [Table] - AlertId [FK] - ByUserId [FK] SensorAlertReading [Table] - SensorAlertId [FK] - SensorReadingId [FK] LoggerAlertReading [Table] - LoggerAlertId [FK] - LoggerReadingId [FK]
- 問題:沒有停止 LoggerAlert和SensorAlert 引用相同的警報(同樣的問題 作爲選項2)。
- 問題:數據庫模糊處理
我認爲到目前爲止,我prefering(不 超霸表更面向對象概念的 數據庫是爲了純粹 關係是不是?)選項1,因爲它看起來很乾淨,意圖很清楚(我希望!),即使我有效地重複表格。
我剛纔想到的唯一的小問題是,不同傳感器的讀數仍可能與一個警報關聯。
我想知道人們對上述選項的看法。我已經看到使用「超級表」經常會推薦安靜,但出於某種原因,它只是感覺不對 - 它幾乎感覺有點像黑客,特別是當我看到嘗試確保數據完整性的方法時。它看起來更像OO編程而不是關係設計。
謝謝。
編輯: 一些進一步的信息,以幫助回答以下一些問題:
大多數的數據庫只能通過應用服務器操作的時候,如果有什麼差別。
實時警報和記錄器警報通常被視爲相同,所以我可能會在大多數時間處理所有警報,而不是以不同方式處理記錄器警報和實時警報。
記錄器具有相當特定的列,位於位置表中。由於位置和記錄器是1對1的映射,因此我決定不使用單獨的記錄器表,到目前爲止它似乎工作得很好並保持簡單。示例列:LoggerRFID(int),LoggerUpperLimit(float),LoggerLowerLimit(float)等等。您幾乎可以認爲記錄器是一個傳感器,但是我沿着這條路走下去,結果並沒有太好。
我幾乎可以接受使警報通用,但作爲答案之一,我試圖對此非常確定,因此在選擇特定路徑之前儘可能繼續研究。
如果我不得不在這些表上工作,我寧願你不會有任何名爲「Id」的列。對我而言,FK列和PK列具有相同的名稱會更容易。只需在「SensorAlert」表中將「Id」名稱展開至「SensorReading」表中的「SensorReadingId」即可。這有助於在需要搜索大量代碼時(您在「Id」上獲得了100萬次虛假搜索,但在「SensorReadingId」上只有很少的次數),或者對許多表進行大量查詢,每個表都有一個「Id」列。 – 2010-11-29 17:24:18
積分 - 這是我總是這樣做的,但肯定會考慮改變我的方式,因爲論證看起來有效。 – Mark 2010-11-30 09:42:47