我正在使用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
使用多对多关系:创建一个表Person
和Interest
,然后创建一个连接每个表 ID 的PersonInterest
。