我正在建立一个基本的照片上传系统,其工作方式如下:
我需要一些关于数据库设计的帮助。我已经制作了4张表,但我不确定设计是否正确。 (在以下所有表中,id是自动递增主键。)
1: Users (id, Username, email, password)
2: Photo (id, username, photo_name, photo_directory)
3: Tags (id, Photo_id, username, Tag)
4: Comments(id, photo_id, comment_author, comment_text, time)
非常感谢你的时间和帮助。
答案 0 :(得分:2)
你真的没有利用你的关系:
Users (id, Username, email, password)
Photo (id, User_id, photo_name, photo_directory)
Tags (id, Photo_id, User_id, Tag)
Comments(id, photo_id, User_id, comment_text, time)
您只想存储相应表格中的ID,然后加入以获取所需信息。
答案 1 :(得分:2)
我认为标签和照片关联应该是一个不同的关联表(如果我明确了标签的含义。)
用户可以创建标签并将其与多张照片相关联。所以,你应该有......
Photo (photo_id, User_id, photo_name, photo_directory)
Tags (tag_id, Tag_name, tag_desc, tag_attribute1)
photo_tag_asc (photo_id, tag_id).
这样,您只能定义一次标记并避免重复。如果你想要一个好的关系设计,这个更准确。
此外,由于第一列是主键,我建议使用列名,如photo_id,tag_id而不是“id”。我知道他们会有表名前缀,但在查询中查看每个列名的表名都不是很整洁。
select p.photo_id, u.user_id
from photo p, user u
where p.user_id = u.user_id
比
更容易阅读select p.id, u.id
from photo p,
users u
where u.id = p.user_id
答案 2 :(得分:1)
您无需在Photo
,Tags
,Comments
中存储用户名。每当您需要对另一个表的引用时,它应该是该表中的主键(user_id
中的Photo
应该在您的情况下引用Users.id
。)
此外,在标记中添加User_id
列似乎是多余的,因为您已经存储了Photo
User_id
的引用。
答案 3 :(得分:1)
这只是将几个先前的帖子(全部上调)合并到一个地方,还有一些小调整。
Users (id, Username, email, password, created_at)
Photo (id, User_id, photo_name, photo_directory, uploaded_at)
Tags (id, tag_name, tag_description)
PhotoTags (photo_id, tag_id)
Comments (photo_id, User_id, comment_text, created_at)
这假定标签定义可以被多个用户使用(因此不被任何用户“拥有”),并且用户只能“标记”他们自己的照片。
答案 4 :(得分:0)
您的设计对我来说似乎不错,但我认为您不需要在关系中使用用户名/用户ID:标签。因为我觉得照片ID和用户ID有一对一的关系。除此之外,设计对我来说很好。
修改强>
在Brian Roach提到的其他关系中也使用id而不是name。