2010-01-12 51 views
2

對於個人項目,我想記錄一系列不相關的事件,以稍後收集簡單的統計數據。每個事件都可以[廣泛]具有與之相關的不同數據。針對事件流的簡單數據庫設計

我在尋找一些關於如何構建這個的建議。由於這是一個小項目,我的主要目標是:

  • 設置的難易
  • 易於使用(即不怪聯接)

性能不是關鍵,我會是隻有用戶。

爲了給你什麼,我瞄準的想法,這是我目前的計劃:

表:Event_Definitions

列:

  • ID
  • 名稱
  • 類型
  • 選項

表:活動

色譜柱:

  • ID
  • Definition_ID
  • Option_Values

所以說,我們有兩個事件定義,像這樣:

ID:0;名稱:Pigeon_Released;類型:時間;選項:null

ID:1;名稱:Fed_Pigeon;類型:Fixed_List;選項:麪包,餅乾,豆腐

然後我們記錄一些事件:

ID:0;定義_ID:1; Option_Values:麪包;備註:null

ID:1;定義_ID:1; Option_Values:豆腐;注:「他咕咕嚕」

ID:2; Definition_ID:0; Option_Values:12:34:56;注意:「我也吼過」

選項值將通過程序強制執行。


一些事件已被收集後,我會被一起收集同一類型的事件進行比較。我不希望檢索具有特定值的事件,只是相同類型的事件。


所以問題是,再次,這個策略或替代方案的任何意見或評論?我很欣賞這種方法的簡單明瞭,但它讓我感到困擾,即使「偶數」的「值」可能是字符串,時間,索引號等等,它們也都存儲在同一列中。

回答

2

有效你有一個數據的「斑點」,可以在原則上不放任何東西,然後一個模式定義說團塊應如何解釋

it's a date 

it's one of these values 

這對於個人項目來說非常合理。 「blob」方法的缺點是在執行查詢時可能存在某種阻礙不匹配的情況。如果你需要處理blob內容,它會有點麻煩。

另一個意見是,你的定義表可能會變得有限制,你想在你的blob中放一些更復雜的結構化數據。

我不知道如果使用XML作爲你的blob有幫助。 XML模式然後定義blob內容,也許你根本不需要你的事件定義表。你的數據庫(有些人是否)有可以利用的任何XML功能?

+0

我喜歡使用XML模式來定義選項的想法,但我沒有預見到任何複雜的選項。到目前爲止我計劃的所有項目都是單值或同一類型的多個值或鍵/值對。 – Ipsquiggle 2010-01-12 19:37:34

+0

我認爲你是對的。但是如果你的數據庫「獲得」XML,你可能會發現它很有用。 – djna 2010-01-12 19:41:13

+0

我通過Python使用SQLite,似乎沒有此功能。我正在選擇這個答案,因爲這些建議似乎與項目的範圍最接近。 – Ipsquiggle 2010-01-12 20:58:29

1

RDBMS不是用作事件流的最佳技術解決方案,而您對變量屬性的要求不符合關係範例。

嘗試使用Message Queue代替。


好的,如果您需要存儲和比較事件,那就不同了。當我聽到「事件」時,我認爲它只是用於實時通知。因此,在這種情況下,我建議使用Message Queue可能不合適。

但是,關係數據庫不容易在表中支持表中的變量屬性。您可以嘗試使用設計模式,如Concrete Table InheritanceClass Table Inheritance來解決您的問題。

+0

消息隊列對我來說是有意義的存儲,但它對於檢索更有效嗎?我將收集所有同類型的活動進行比較。 – Ipsquiggle 2010-01-12 18:44:31

+0

我曾考慮將每種類型的事件放入它自己的表格中(似乎是Table Inheritance提供的簡化),但我期望有相當多的事件定義,並且可能會在正常使用期間創建新的定義。無論如何,我從來沒有聽說過表繼承,我將提交一個供以後使用。 :) – Ipsquiggle 2010-01-12 20:56:28

1

大多數事件蒸汽應用程序使用XML來定義事件對象。儘管很多人擁有類似SQL的語言,但他們不使用底層的RDBMS。您可能想要查看Marco of ruleCore誰經歷了設計自己的CEP應用程序的整個練習並對其進行了博客。

StreamBaseCoral8即使流引擎需要在設計時的事件流的模式,因此,即使他們可能不適合你的"wildly different data".

這樣的要求,在結束時,你可能需要使用如:

<event> 
    <head> 
     <id>12784536</id> 
     <type_id>51</type_id> 
     <time_stamp>2008-12-11T13:25:57.014Z</time_stamp> 
     <source_id>862</source_id> 
    </head> 
    <body> 
     <!-- Event specific data here --> 
    </body> 
</event> 
+0

我已經更新了這個問題來澄清(希望):數據庫的目標不是發送事件,而是記錄它們以便稍後進行統計信息收集。事件流可能不是正確的用語。 在任何情況下,這些'流引擎'看起來對於這個項目來說都是過分的。 – Ipsquiggle 2010-01-12 19:27:58

1

我已經嘗試了一個與rulecore的小項目來開發一個有點像你的系統。我用一個mysql數據庫來存儲事件流,然後將它們批量發送到rulecore,我創建了大約20條規則。 rulecore事件格式非常簡單,包含任何可以包含任何內容的命名屬性。我也這樣做了,因爲我第一次嘗試使用SQL查詢導致了一個複雜的模式,並且很長時間並且很難理解查詢。 rulecore規則簡單得多。

+0

似乎有一些東西叫'rulecore'。你能提供一個鏈接嗎? – Ipsquiggle 2010-01-13 16:52:21

+0

你可以在rulecore.com找到它 – Stjoan 2010-01-15 10:04:11