2013-02-15 4 views
4

Я продолжаю читать, что я должен хранить это в отдельной таблице «с одним значением в строке». Что это значит? Как это - чтобы каждый «favoriting» получал другую запись пользователя?Как хранить пользовательские «избранное» в таблице mySQL?

USER_ID  SKU_Favorited 

001   10016 
001   10067 
024   10016 
001   10010 
024   16779 

Кажется избыточным, чтобы ввести одного и того же пользователя дважды, но это то, что я должен делать? Тогда в поиске я просто SELECT sku WHERE user id ... и найти все SKU рядом с этим номером?

+0

Как бы вы это делать вместо этого? –

+2

Это известно как отношение ManyToMany и нормальная практика. У вас нет избыточных пользователей, потому что все пользовательские данные находятся в таблице «Пользователь», а не в таблице «Избранное» –

ответ

4

Это называется реляционных баз данных, которые находятся в 3-й нормальной форме

У вас есть одна таблица с пользователями.

//users 
id | username | password 

И таблица с фаворитами

//favorites 
id | userid | Favorited 

здесь, как вы получите:

select * from favorites inner join users on favorites.userid=users.id where users.id=1

+0

Так что для каждого любимого ску будет новая запись, правильно? поэтому skus и идентификаторы пользователей будут повторяться повсюду в таблице? – frankie

+0

По мне, таблица избранных не должна иметь идентификатор. (userid, Favorited) должен быть основным ключом. – gd1

+0

@frankie: Ну, тот же самый идентификатор пользователя и тот же sku в одной записи должен быть уникальным. Кроме этого, это правильно. – Andrew

0

Да, это именно то, как вы это сделаете. Я бы не счел это излишним.

2

В relational model нет других простых способов сделать это, так как пользователи и избранное имеют отношения Много-ко-многим.

Ваш подход следует обычной практике. Просто убедитесь, что USER_ID и SKU_Favorited сделать первичный ключ (вместе).

Что-то, что я иногда видел, но это анти-паттерн, и вы должны никогда сделать это, является «сериализацией» «Избранном» сторона, т.е. ввода идентификатора пользователя в одном столбце и что-то вроде «1001,4514,41154,4411» в другом.
Это кажется более «кратким», но очень неразумно, потому что 1) вы вынуждены использовать поле VARCHAR для второго столбца, 2) обратный поиск затруднен и 3) вы не можете изменить идентификатор избранного.

+0

Я бы не сказал ** «никогда» ** (хотя это * - это подход, который следует преподавать) но, скорее, «никогда» * с несколькими звездами после него - рассмотрите систему маркировки SO ;-) В любом случае денормализации, если это будет сделано, должно предшествовать тщательная и продуманная мысль. – 2013-02-15 20:44:50

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