好的我正在创建一个小社区网站。用户加入我的网站,他可以选择
输入他的信息上传照片添加朋友并发布到他的墙上。到现在为止我想知道如何实现专辑表。
相册具有以下属性:
albumID albumName albumCover albumDescription albumDate albumPrivacy enum userID username
现在我想知道如何将相册表与users表相关联。每个用户都有自己的ID和用户名。 usersId是主键,用户名是唯一的
1位用户可以拥有多张专辑。 1张专辑只能属于1个用户。
我怎么能建立关系?
请帮助,因为我不擅长数据库,我希望以优化和安全的方式完成工作。
到目前为止,我使用userid和username作为相册表中的属性来识别哪个相册属于谁。像这样SELECT * FROM albums WHERE userid='$userid' AND username ='$username'
。
其中$ userid是会话变量的值,$ username是会话变量的值。
答案 0 :(得分:2)
你做的方式非常正确。您只需要在相册表中包含userID列,因为它是用户表中的主键,因此保证是唯一的。在专辑表中使用用户名列是多余的。
您只需要确保相册表中的userID列定义为FOREIGN KEY,当然还应用了索引。
答案 1 :(得分:2)
Users表中是否有用户名?如果是这样,那么您也不必担心将其包含在“相册”表中。
usersId是主键,用户名是唯一的。
为了澄清,userID应该是Users表上的主键,但是Albums表上的外键(如提到的那样)。 “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注入攻击。用户输入会带来更大的危险,因此使用会话变量应该没问题。但这仍然是一个很好的习惯。