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

Не храните данные как в "РСУБД". Создайте новую таблицу, это сэкономит вам много головной боли по дороге ... – sgeddes

+0

Что произойдет, если вы захотите найти записи, где третья - 18? – ceejayoz

+0

Кажется настолько глупым иметь таблицу, состоящую из двух полей. {AccountID, EventIndex} –

ответ

1

Это нарушает первую нормальную форму:

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 

Edit: Добавлено первичный ключ к таблице соединений, благодаря комментарию okiharaherbst.

+0

Для полноты вы также должны однозначно индексировать пару '(user_id, event_id)'. –

Смежные вопросы