3

好的,我正在创建一个小型社区网站。一个用户加入我的网站,他可以选择输入他的信息上传照片添加朋友和张贴到他的墙上。现在我想知道如何实现专辑表。

专辑具有以下属性:

albumID
albumName
albumCover
albumDescription
albumDate
albumPrivacy enum
userID
username

现在我想知道如何将相册表与用户表链接起来。每个用户都有自己的 ID 和用户名。usersId 是主键,用户名是唯一的。
1 个用户可以拥有多个相册。1 个相册只能属于 1 个用户。我该怎么办关系???

请帮忙,因为我不擅长数据库,我想以优化和安全的方式完成工作。

到目前为止,我使用用户 ID 和用户名作为专辑表中的属性来识别哪个专辑属于谁。像这样SELECT * FROM albums WHERE userid='$userid' AND username ='$username'
其中 $userid 是会话变量的值,$username 是会话变量的值。

4

2 回答 2

2

用户表中有用户名吗?如果是这样,那么您也不必担心将其包含在“相册”表中。

usersId 是主键,用户名是唯一的。

澄清一下,userID 应该是 Users 表上的主键,但 Albums 表上的外键(如 matthewh 所述)。“albumID”是应该是专辑表的主键的列。

您的 SELECT SQL 也可以简化,因为您的 WHERE 子句中不需要用户名。我将假设用户不能拥有多个用户名,因此仅在 WHERE 中声明 userID 就足够了。

但是,如果您仍想在相册结果集中查看用户名,您可以执行以下操作:

SELECT a.*, u.username
FROM albums a
INNER JOIN users u ON u.userid = a.userid
WHERE a.userid='$userid';

此外,我不得不提一下,您应该真正参数化您的 SQL 语句(在您的 PHP 代码中),而不是将您的 SQL 命令字符串连接在一起。这将保护它免受 SQL 注入攻击。用户输入的危险更大,因此使用会话变量应该没问题。但这仍然是一个好习惯。

于 2012-01-22T01:30:33.670 回答
2

你这样做的方式非常正确。您只需要专辑表中的 userID 列,因为它是用户表中的主键,因此保证是唯一的。在专辑表中包含用户名列是多余的。

您只需要确保专辑表中的 userID 列被定义为FOREIGN KEY并且当然应用了索引。

于 2012-01-22T01:22:35.610 回答