我正在使用Php / MySQL构建一个站点,我的问题非常简单(我希望)。在注册过程中,要求用户从大约15的列表中选择他们的兴趣。对于每个用户,将这些存储在数据库中的最佳方法是什么?我应该将兴趣存储在一个单独的表中并有一个连接表来匹配user_id到interest_id吗?
答案 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)
使用多对多关系:创建一个表Person
和Interest
,然后创建一个加入每个表的ID的PersonInterest
。