如何在数据库中存储用户兴趣

时间:2013-12-17 14:35:30

标签: php mysql

我正在使用Php / MySQL构建一个站点,我的问题非常简单(我希望)。在注册过程中,要求用户从大约15的列表中选择他们的兴趣。对于每个用户,将这些存储在数据库中的最佳方法是什么?我应该将兴趣存储在一个单独的表中并有一个连接表来匹配user_id到interest_id吗?

4 个答案:

答案 0 :(得分:8)

是的,最好保留数据库normalized,以便更容易查询常见信息(即获取所有感兴趣的用户)。

您可以拥有一个感兴趣的interests表:

| iID | iInterest |
| 1   | Cars      |
| 2   | Computers |

然后,例如,您的用户表:

| uID | uName |
| 1   | John  |
| 2   | Jake  |

然后你会有一个多对多的关系表,将用户与兴趣联系起来(UserInterests):

| uID | iID |
| 1   | 1   |
| 1   | 2   |
| 2   | 2   |

由此可以看出,用户John喜欢汽车和电脑,但用户Jake只喜欢电脑。假设您希望获得所有喜欢计算机的用户,您只需将这些表连接在一起:

SELECT uName 
FROM Users 
INNER JOIN UserInterests ON Users.uID = UserInterests.uID 
AND UserInterests.uID = 2

答案 1 :(得分:3)

  

我应该将兴趣存储在一个单独的表中并且有一个连接表来匹配user_id到interest_id吗?

是。它被称为junction table并且可以确保不存在利益本身的重复,允许用户具有多个兴趣并使用数字键(比字母数字键更快)。

改编自维基文章:

CREATE TABLE Users (
    UserId INTEGER PRIMARY KEY,
    UserPassword VARCHAR(50) NOT NULL,
    UserName VARCHAR(50) NOT NULL
)

CREATE TABLE Interests (
    InterestId INTEGER PRIMARY KEY,
    InterestDescription VARCHAR(500) NOT NULL
)

-- This is the junction table.
CREATE TABLE UserInterests (
    UserId INTEGER REFERENCES Users (UserId),
    InterestId INTEGER REFERENCES Interests (InterestKey),
    PRIMARY KEY (UserId, InterestKey)
)

答案 2 :(得分:1)

是的,你应该有一个Users表和一个没有重复的Interests表。

然后,您应该有一个映射表来将用户映射到他们的兴趣,可能称为UserInterests

确保在创建映射表时创建主键(user_id,interest_id),并且它们也是外键

更新

这是一个指向sqlFiddle的链接,您可以在其中针对我们提出的架构运行一些查询。 http://sqlfiddle.com/#!2/f500a8/6

答案 3 :(得分:1)

使用多对多关系:创建一个表PersonInterest,然后创建一个加入每个表的ID的PersonInterest