2014-11-24 61 views
0

我需要跟蹤用戶帳戶旁邊的「事件」,我不希望爲其添加整個數據庫表。集合的最佳數據類型

什麼是最好的數據類型來存儲集合/整數數組?

我在想我可以使用文本,只是將值解析到數組中,但必須有更有效的方法。

{} 1,6,18,427,293

^假設我有類似這樣的數組,但它可以更小,也可能是更長的時間,它只是取決於用戶。

這基本上就是我想創建

用戶

Id | Name | Events 
0  James  {1,2} 
1  Kitty  {0} 
2  Mark  {1,3} 
3  Adam  {1,2,3} 

活動

Id | Name | Location | Date 
0  Event 1  Here  Tommorow 
1  Event 2  There  Yesterday 
2  Event 3  Around Eventually 
3  Event 4  Near  Someday 

對用戶的活動領域,什麼是做到這一點的最好辦法。

+3

不要將這樣的數據存儲在'RDBMS'中。創建新的表格,它會爲您節省很多頭痛的道路... – sgeddes 2014-11-24 21:44:09

+0

當您想查找第三個是18的記錄時會發生什麼? – ceejayoz 2014-11-24 21:45:49

+0

有一張由兩個字段組成的表似乎很愚蠢。 {AccountID,EventIndex} – 2014-11-24 21:46:17

回答

1

這違反了第一範式:因爲它包含在企業SENS多個值

First normal form (1NF) is a property of a relation in a relational database. 
A relation is in first normal form if the domain of each attribute contains 
only atomic values, and the value of each attribute contains only a single 
value from that domain. 

User.Events列不是原子。

這裏的解決方案是創建另一個表,稱爲junction table,這是表示N:N關係的經典方法。 (通常稱爲table1name_table2name)

此表包含到這兩個表的引用:

CREATE TABLE User_Event (
    UserId INTEGER NOT NULL REFERENCES User(Id), 
    EventId INTEGER NOT NULL REFERENCES Event(Id), 
    PRIMARY KEY (UserId, EventId) 
) 

根據您的例子,該表的值將是:

UserId | EventId 
0   1 
0   2 
1   0 
2   1 
2   3 
3   1 
3   2 
3   3 

編輯:新增這是交叉表的主要關鍵,這要感謝okiharaherbst的評論。

+0

爲了完整性,你還應該唯一索引'(user_id,event_id)'對。 – 2014-11-24 22:22:39

相關問題