需要数据库设计帮助

时间:2011-04-06 17:46:06

标签: database-design

我正在建立一个基本的照片上传系统,其工作方式如下:

  1. 用户通过提供非常基本的信息(唯一的用户名,电子邮件和密码)进行注册。
  2. 注册用户可以上传带有标题和标签的照片(照片名称,目录,标签和标题保存在数据库中)。
  3. 任何注册用户都可以在照片上添加评论。
  4. 我应该能够检索用户名的所有标签(他在所有上传的照片中都使用了这些标签)。
  5. 我需要一些关于数据库设计的帮助。我已经制作了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) 
    

    非常感谢你的时间和帮助。

5 个答案:

答案 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)

您无需在PhotoTagsComments中存储用户名。每当您需要对另一个表的引用时,它应该是该表中的主键(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。