2011-02-08 128 views
2

我們的數據庫是(專門的)桌面應用程序的一部分。 主要目標是保留有關某些事件的數據。數據庫設計

活動每隔幾分鐘發生。

收集的關於事件的數據隨着新的數據組被添加進來並且舊的數據幾乎每月換出(數據出現在確定的組中),頻繁變化。

我不得不把一個數據庫來跟蹤的事件。第一次刺激可能是隻有一個大表,其中每一行都是一個事件,這基本上是我們的數據看起來像,但這似乎是不受歡迎的,因爲我們不斷變化的數據組(即列的數量要麼不斷增長,否則我們會不斷地讓這個月的數據庫與上個月的數據庫不兼容 - 唉!)。因此,即使創建了循環引用,我仍然朝着以下方向發展。 (但也許這是一個愚蠢的想法)

表活動的第1個月
本月2
表集團
表集團...

表活動具有創建表:
刪除級聯以刪除引用它的外鍵的行的主鍵
每個數據組表

每個數據分組表有:
主鍵,它的缺失級聯到空出來的外鍵引用它
列的數據組中
非空的外鍵回到事件

這仍然使您不斷髮展,變化的事件表(因爲您需要爲每個新數據組添加新的外鍵列),這一切都不那麼激烈。然而,它似乎比一張巨大的桌子更加模塊化。這是一個很好的解決方案嗎?如果不是,那是什麼?

有什麼建議嗎?

P.S.我們使用SQL Express或SQL精簡(我們目前正在嘗試用哪一個適合我們最好的)

+1

請舉例說明一些示例數據? – 2011-02-08 17:53:13

+0

幾乎完全是直線數字數據。只有一列或兩列包含文字。其他一切都是原始的數字數據。 – 2011-02-08 19:13:28

回答

0

你不應該在事件表中的每個數據分組表的外鍵。

事件表已經有一個event_id的是在每個數據組表。所以你可以從事件中獲取子表格。此外,事件表中的舊行不在最新的數據組表中。所以你真的不能擁有一個外鍵。

這就是說,我想知道數據組表中是否有其他結構可用於清理設計。不知道他們看起來像什麼,我不能說。但如果有的話,請考慮利用它! (每個月更改的架構是一種非常糟糕的代碼異味。)

1

爲什麼不能在一個XML列基本使用單個表方法和存儲改變事件數據作爲XML?您甚至可以使用XSD模式來說明變化的數據類型,並且如果需要在某些XML數據上實現快速查詢性能,則可以在XML數據上添加索引。

永久改變DB模式不會真的是一種選擇,如果我要實現這樣的數據庫。

0

將數據存儲在儘可能細化的級別。這可能是這麼簡單:

的EventSource INT FK
事件類型INT FK
時間INT
OccuredOn日期時間

獲取數據的權利,並儘可能在第一時間一樣簡單,然後

  1. 通過視圖或查詢進行聚合。你的直覺對於列的不斷變化的本質是正確的 - 在T-SQL中比在DDL中更好地控制它。

  2. 幾年前,我遇到了這個問題,其中涉及到媒體播放器的大規模軍隊的日誌文件,最終我最終得到這些數據並創建了一個OLAP多維數據集。 OLAP是數據庫設計的另一種方法,重要的是要優化報告和「分片性」。這聽起來像你在這條軌道上,能夠看到一個月的數據視圖,然後是一個季度,然後再回到一個星期的數據將是非常有用的。這是OLAP的用途。

微軟的技術是Analysis Services,它是Sql Server的一部分。如果你不想全部投入(OLAP有一個非常陡峭的學習曲線),你也可以考慮做一個有選擇性的非規範化數據庫,每晚使用源數據庫中的ETL進行填充。

HTH。