2013-02-28 4 views
1

Я хотел бы реализовать следующую/любимую систему. Я могу представить два способа реализации структуры базы данных/таблицы, но я не уверен, какой из них реализовать. Какой из них будет считаться передовой практикой и, самое главное, почему?Структура базы данных MySQL для последователей

Я поместил всех своих последователей в одну строку. Помещая всех последователей в одну строку, это уменьшает количество избыточных строк.

Ex.

ID (1) || user_id (1) || follower_ids (2, 3, 45)

'CREATE TABLE `users` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `username` varchar(20) NOT NULL, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 

'CREATE TABLE `follow` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `user_id` int(10) unsigned NOT NULL, 
     `follower_ids` text NOT NULL, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 

ИЛИ

Я положил каждый follow_id по отдельности, но добавляет избыточность, имеющую 3 строки, для одной и той же user_id.

Ex.

ID (1) || user_id (1) || follower_id (2)

ID (2) || user_id (1) || follower_id (3)

ID (3) || user_id (1) || follower_id (45)

'CREATE TABLE `users` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `username` varchar(20) NOT NULL, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 

'CREATE TABLE `follow` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `user_id` int(10) unsigned NOT NULL, 
     `follower_id` int(10) unsigned NOT NULL, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 
+0

не из них. Они оба пропускают индексы, вероятно, самые важные. –

ответ

4

Ваш второй вариант с небольшой модификацией имен полей, поскольку как последователь, так и последующие - это ОБЩИЕ user_id. Как упоминалось Джоном, добавьте внешние ключи в оба поля * _user_id в следующей таблице.

Кроме того, никогда не имеют имен таблиц множественного числа. «пользователь» и «следовать». Я лично предпочитаю такие таблицы, как «следовать», чтобы иметь префикс типа «xref_», так что я знаю, что это просто таблица с перекрестными ссылками, позволяющая отношения «многие-ко-многим» (пользователь может следить за множеством пользователей, а пользователь может иметь много следующих пользователей).

'CREATE TABLE `user` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `username` varchar(20) NOT NULL, 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 

'CREATE TABLE `follow` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `followed_user_id` int(10) unsigned NOT NULL, 
     `follower_user_id` int(10) unsigned NOT NULL, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 
4

Лучший способ не является ни тем, ни другим. У вас должен быть средний стол между таблицей и таблицей последователей. Средняя таблица имеет только две колонки. follow_id и followers_id. При таком подходе вы опускаете недостатки двух упомянутых вами решений. Вам не нужно обрабатывать строку, и вы не дублируете записи, а показатели с включенными только индексами довольно быстро.

'CREATE TABLE `follow` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 

'CREATE TABLE `user` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `username` varchar(255) unsigned NOT NULL, 
     .... 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 
'CREATE TABLE `follow_user` (
     `user_id` int(10) unsigned NOT NULL, 
     `follower_id` int(10) unsigned NOT NULL, 
) 

Потому что вы измените ваш пост много, я думаю, что ваш второй подход лучше, если последователи такой же, как пользователи. Поскольку вы сохраняете только индекс indexex и пользователей, а хороший запрос выбора, чтобы увидеть, что один пользователь следует за чем-то, намного лучше, чем синтаксический анализ и поиск строки. Дублирующие записи не являются проблемой, потому что они являются только индексами, и нет проблем с этим ,

+0

Можете ли вы дать мне пример структуры таблицы, чтобы я мог лучше понять? – user1307016

+0

Я добавил код. Есть что-то еще, что вы хотите? – MIIB

+0

Итак, как бы вы хотели запросить эту информацию? Как, например, добавление последователя? Я не совсем уверен, почему вам понадобится таблица последователей, когда у вас уже есть таблица пользователей со всеми пользователями (вы назвали свою таблицу пользователей)? – user1307016

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