2010-08-01 4 views
0

Я борюсь с этой простой идеей. Посмотрите на reddit, когда вы зарегистрируетесь для новой учетной записи .. вы автоматически подписываетесь на некоторые каналы по умолчанию.несколько строк или один столбец [производительность sql]

Я хочу сделать то же самое с моим сайтом.

Я знаю, что я мог бы сделать простой и глупый user_chan с идентификатором, user_id, Chan_ID

если чан как это:

ID | NAME 
1 | videos 
2 | pictures 

user_chan бы, как это (я 'm пользователя 1)

ID | USER_ID | CHAN_ID 
1 | 1  | 1 
2 | 1  | 2 

Я т Здесь очень ясно: D

Я думаю, что так работает reddit. Но каждый раз, когда пользователь подписывается, им приходится вставлять дюжину строк. И я думаю, у них есть множество пользователей!

Так это решение в пользователя таблицы, как это более умный:

ID | USER_NICKNAME | CHANS 
1 | me   | 1,2 

ответ

3

Не используйте один столбец для хранения нескольких значений. Это денормализация, которая позже причинит боль. Например, когда вам нужно запросить, у какого пользователя есть канал 3, вам придется использовать LIKE, что будет плохо работать. Когда вам нужно удалить только один канал из нескольких пользователей, он становится еще сложнее.

В большинстве баз данных вы можете вставить несколько строк с одним оператором INSERT. Точный синтаксис зависит от платформы; в SQL Server вы можете сделать это:

insert into user_chan 
(USER_ID, CHANID) 
select 7634, 3 
union all 
select 7634, 27 
union all 
select 7634, 9 
+0

Вау, я не думал о том, «когда вам нужно запросить у пользователя канал 3». Правильно. Это ситуация, которая подсказывает мне выбрать решение 1 –

+0

+1 Если вы _ever_ обнаруживаете, что используете части столбцов, вы делаете что-то неправильно. Функции в строке не очень хорошо масштабируются. Вы будете запрашивать этот DB _far_ чаще, чем писать на него. Планируйте соответственно. И я даже сомневаюсь в необходимости одного оператора insert. Сделки будут делать то же самое, и это не будет сделано достаточно часто, чтобы вызвать проблему. – paxdiablo

0

Или используйте столбец XML для хранения нескольких значений, как вы предложили. Это может иметь индекс XML и может быть запрошен/обновлен и т. Д., Так как вы бы использовали реляционную таблицу (хотя и более сложный синтаксис).

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