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


How to store user interests in database

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

是的,最好保持数据库规范化,以便更轻松地查询公共信息(即,获取所有对此感兴趣的用户)。

您可以有一个interests表,其中包含以下兴趣:

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

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

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

然后,您将有一个将用户链接到兴趣(用户兴趣)的多对多关系表:

| 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

我是否应该将权益存储在单独的表中,并有一个联接表来将user_id与interest_id匹配?

是的。它被称为连接表,可以确保兴趣本身没有重复,允许用户有多个兴趣并使用数字键(比字母数字键更快)。

改编自维基文章:

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)
)

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

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

确保在创建

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

更新

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

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