2014-11-24 65 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

相关问题