2017-09-14 103 views
2

我正在嘗試爲不同類型的事件創建數據庫。每個事件都有任意的,用戶創建的不同類型的屬性。例如「客人數量」,「特殊歌曲播放」,「小丑到達時間」。並不是每個活動都有一個小丑,但一個用戶仍然可以與一個小丑舉辦不同的活動。我的基本概念是與不同數據類型的多對多關係

propID | name | type 
------ | ---- | ----- 
    1 |#guest| number 
    2 |clown | time 

和另一個表,每個事件都有唯一的eventID。問題是,一個簡單的方法,如

eventID | propID | value 
------ | ------ | ----- 
    1 | 1 | 20 
    1 | 2 | 10:00 

由於不同的數據類型並不真正工作。

現在我想到了一些可能的解決方案,但我不知道哪一個最好,或者是否有更好的解決方案?

1.

我將所有值存儲爲字符串,並在屬性表中使用數據類型。我認爲這被稱爲EAV,並不被認爲是良好的做法。

2.

有唯一有意義的數據類型的數量有限,這可能會導致一個表是這樣的:

eventID | propID | stringVal | timeVal | numberVal 
------ | ------ | --------- | ------- | -------- 
    1 | 1 | null  | null | 20 
    1 | 2 | null  | 10:00 | null 

3.

使用像多個表可能的數據類型:

 propDateEvent     propNumberEvent 
--------------------------   -------------------------- 
eventID | propId | value   eventID | propId | value 
--------|--------|--------   --------|--------|-------- 
    1 | 2 | 10:00    1 | 1 | 20 

不知何故,我認爲每個解決方案都有其起伏。 #1感覺像最簡單但最不健壯的。 #3似乎是最乾淨的解決方案,但如果我想添加例如每個事件的屬性優先級。

+0

看看[this](https://stackoverflow.com/questions/4481672/is-eav-hybrid-a-bad-database-design-choice)和[this](http:// sqlblog。 COM /博客/ aaron_bertrand /存檔/ 2009/11/19 /什麼,是那麼壞有關,EAV-anyway.aspx)。因爲它的靈活性,Imho,第一種情況會更好,如果你沒有有限類型的數據類型的話。 – kzharas210

回答

0

您提出的所有選項都是實體/屬性/值或EAV的變體。基本概念是,您將實體(在您的事件事件中),它們的屬性(#guest,小丑)以及這些屬性的值存儲爲行,而不是列。

Stack Overflow上有很多關於EAV的問題,討論了好處和缺點。

您的3個選項提供了不同的數據存儲方式 - 但是您沒有說明您想要檢索數據的方式,或者驗證您要存儲的數據。這是EAV最大的問題。

您將如何執行所有事件必須具有「#客戶」作爲必填字段(例如)的規則?你如何找到所有至少有20位客人的活動,而且沒有小丑噱頭?您將如何顯示兩個日期之間的事件列表,按日期排序以及客人人數?

如果這些要求對你無關緊要,EAV是好的。如果他們這樣做,請考慮使用文檔來存儲此用戶定義的數據(JSON或XML)。 MySQL可以本地查詢這些文檔,您可以更輕鬆地執行業務邏輯,並且即使是最簡單的業務案例,您也不必爲此編寫極其令人費解的查詢。