2013-02-15 75 views
4

我一直在阅读,我应该把它存储在一个单独的表格中,“每行一个值”。这是什么意思?像这样 - 这样每个“收藏”获得另一个用户条目?我应该如何将用户“收藏夹”存储在mySQL表中?

USER_ID  SKU_Favorited 

001   10016 
001   10067 
024   10016 
001   10010 
024   16779 

似乎多余的必须进入同一个用户两次,但这是我应该做的?然后在查找我只是SELECT SKU WHERE用户ID ...并找到该号码旁边的所有SKU?

+0

你会怎么做呢? – 2013-02-15 20:33:53

+2

这被称为ManyToMany关系和正常实践。你没有多余的用户,因为所有的用户数据都在用户表中,而不是收藏表 – 2013-02-15 20:35:41

回答

4

它被称为关系数据库,它是三维标准形式

你有一个用户表。

//users 
id | username | password 

而且随着收藏表

//favorites 
id | userid | Favorited 

这里你如何得到它:

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

+0

因此,对于每个喜爱的sku,都会有一个新条目,对吗?所以Skus和用户ID将在整个表中重复出现? – frankie 2013-02-15 20:42:18

+0

据我介绍,收藏夹表不应该有一个ID。 (userid,Favorited)必须是主键。 – gd1 2013-02-15 20:42:56

+0

@frankie:好的,一个条目中的相同userid和相同sku应该是唯一的。除此之外,这是正确的。 – Andrew 2013-02-15 20:43:10

0

是的,这正是你如何做到的。我不认为它是多余的。

2

relational model中没有其他简单的方法可以做到这一点,因为用户和收藏夹具有多对多的关系。

您的方法遵循常规做法。只需确保USER_IDSKU_Favorited将主键(在一起)。

东西我偶尔看到,但它是一个反模式,你应该永远,是“串行化”的“收藏夹”的一面,即把用户ID的一列,在另一个类似“1001,4514,41154,4411”的东西。
这看起来更“简洁”,但是非常不明智,因为1)第二列不得不使用VARCHAR字段,2)反向查找困难,3)您无法更改收藏夹的ID。

+0

我不会说**“从不”**(尽管这*是应该教的方法),而是“从不”*,后面有几颗星星 - 考虑SO的标签系统;-)无论如何,如果完成了非规范化,应该在仔细和慎重的思考之前进行。 – 2013-02-15 20:44:50

相关问题