2017-06-19 49 views
0

我想爲事件設計一個數據庫並跟蹤大量關於它的統計信息。設計數據庫以存儲具有很多值的記錄的最佳方式是什麼?

選項1

Events創建一個表,並把我所有的統計數字列吧。就像男性的數量,女性的人數,身份不明性別的數量,當天的溫度,時間就開始了,任何打架,被警方叫,等

查詢將是一個非常簡單的select * from events

選項2

創建兩個表格,一個用於Events,另一個用於EventsAttributes。在Events表中,我將存儲重要的東西,如id,事件標題和開始/結束時間。

EventsAttributes我會存儲所有事件統計信息並將它們鏈接回Events並使用eventId外鍵。

該查詢如下所示。 (attributeType == 1將代表男性的數量)

select e.*, (select ev.value from EventAttributes ev where ev.eventId = e.id and attributeType = 1) as NumberOfMale from Events e

查詢將不會是直線前進的選項1,但我想設計的正確方法,並與凌亂查詢生活。

那麼哪個選項是正確的做法,爲什麼(我不是數據庫管理員,但好奇)。

謝謝你的時間。

+1

選項1聽起來像是解決這個問題的典型方法。選項2聽起來像EAV(實體屬性值),這是一種非常罕見的邪惡反模式。把表看作一種保存實體所有屬性的方法,在這種情況下是一個事件。我可能會考慮一些額外的表格,用於在事件期間可能發生一次以上的事情(如警察電話,受傷等)。 –

+1

在選項2中,您忘記了第三個表AttributeTypes。如果你將這個查詢硬編碼到你的應用中,那確實是一件壞事。 –

+0

@RogerWolf你是對的。我忘了提到這一點。 – HDoan

回答

0

我更喜歡使用選項2來設計數據庫。

在該選項(2)中,應用了數據庫標準化的最佳實踐。

有正常化數據庫主要有三個原因:

  • 首先是儘量減少重複的數據。

  • 第二是最小化或避免數據修改發出

  • 三是要簡化查詢。

有關詳細信息,根據這個規範化的數據庫上閱讀Designing a Normalized Database

您可以創建視圖(查詢)來支持選項(1)。

以這種方式,數據庫將爲任何未來的縮放做好準備。

更新:

您可以使用寶貴的運營樞紐和公共表表達式(CTE),以獲得eventAttributes1,eventAttributes2,...

假設你的表是:事件和event_attributes描述如下:

events 
    ---------- 
    # event_id 
    event_title 
    start_date 
    end_date 

    event_attributes 
    ------------- 
    #event_id 
    #att_type 
    att_value 

    # is primary key 

    -- using table expression (it's like a dynamic view) 

    with query as (
    select e.event_id, e.event_title,a.att_type, a.att_value 
    from events e 
    join event_attributes a on e.event_id =a.event_id 
    ) 
    select event_id , event_title, 
    [1] as eventAttributes1, -- list all eventAttributes1 numbered [1],[2],... 
    [2] as eventAttributes2 
    [3] as eventAttributes3 
    FROM query 
    PIVOT(SUM(att_value) FOR att_type IN ([1],[2],[3])) as pvt 

有關支點讀細節:Using PIVOT

詳情Using Common Table Expressions

+0

我更喜歡選項2,但是如何有效地查詢這兩個表,以便數據組合如'id,eventName,eventAttributes1,eventAttributes2,...' – HDoan

+0

選項2是一個EAV,它可以非常迅速地變得非常複雜。對於數據庫領域相對陌生的人來說,我不推薦這樣做。是的,我絕對同意規範化是最好的方式,但我認爲這種情況不需要EAV。 –

+0

@Sean Lange,對於數據庫領域的新成員來說,任何一個新手都會成爲專家,而且數據庫將會變得非常複雜,以便將來可以使用大量數據進行規範化。 –

相關問題