Database design 需要数据库设计方面的帮助吗

Database design 需要数据库设计方面的帮助吗,database-design,Database Design,我正在构建一个基本的照片上传系统,其工作原理如下: 用户通过提供非常基本的信息(唯一的用户名、电子邮件和密码)进行注册 注册用户可以上传带有标题和标签的照片(照片名称、目录、标签和标题保存在数据库中) 任何注册用户都可以在照片上添加评论 我应该能够检索用户名的所有标签(他在上传的所有照片上都使用了这些标签) 我需要一些数据库设计方面的帮助。我做了以下4个表格,但我不确定设计是否正确。 (在以下所有表格中,id为自动递增主键) 非常感谢您的时间和帮助。您真的没有利用您的关系: Users (id,

我正在构建一个基本的照片上传系统,其工作原理如下:

  • 用户通过提供非常基本的信息(唯一的用户名、电子邮件和密码)进行注册
  • 注册用户可以上传带有标题和标签的照片(照片名称、目录、标签和标题保存在数据库中)
  • 任何注册用户都可以在照片上添加评论
  • 我应该能够检索用户名的所有标签(他在上传的所有照片上都使用了这些标签)
  • 我需要一些数据库设计方面的帮助。我做了以下4个表格,但我不确定设计是否正确。 (在以下所有表格中,id为自动递增主键)


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

    您真的没有利用您的关系:

    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,然后连接以获取所需的信息。

    我觉得您的设计不错,只是我认为您不需要在relationship:Tags中包含用户名/用户id。因为我觉得照片id和用户id有一种关系。除此之外,这个设计对我很好

    编辑


    也可以在Brian Roach提到的其他关系中使用id而不是名称

    您不需要在
    照片
    标签
    注释
    中存储用户名。当您需要引用另一个表时,它应该是该表中的主键(
    Photo
    中的
    user\u id
    在您的情况下应该引用
    Users.id


    另外,在标签中为
    用户id
    列似乎是多余的,因为您已经存储了对
    照片的引用,该引用具有
    用户id

    ,我认为标签和照片的关联应该是一个不同的关联表(如果我正确理解标签的含义的话)

    用户可以创建标签并将其与多张照片关联。所以,你应该

    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
    

    这只是合并了几个以前的帖子(都是向上投票的)到一个地方,还有一些小的调整

    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)
    

    这假定标记定义可以由多个用户使用(因此不属于任何用户),并且用户只能“标记”自己的照片。

    谢谢您的回复。您建议的唯一更改是将username替换为user\u id。使用user\u id代替username有什么好处。用户名是唯一的(用户不能更改用户名)。感谢您的时间。除了您永远不想造成诸如更改用户名之类的问题之外(即使您现在说不想这样),使用Ids将节省您的空间(一个整数通常会使用4或8个字节,而您的用户名会更大)当你加入这些表格时,速度也会快得多;与单个整数比较相比,字符串比较是线性的,而且相当昂贵(尽管索引可以减轻这一点)。@sudeep-您应该同时拥有userid和username。用户id将是您的主键和自动生成的列。用户名是唯一的(但可以更改,如果用户愿意)。谢谢。我只是想知道标签表中的标签描述是什么?示例标记类似于“nature”或“forest”等,这将是标记名称,因此不需要标记描述?这取决于具体情况,当我看到它时,我正在考虑堆栈溢出。标签可能是抽象的或令人困惑的——毕竟,谁创建或控制它们?请尝试将鼠标悬停在SO标记上,以获取描述示例(例如,您为此问题选择的“数据库设计”标记)。非常感谢。这个评论表可以吗:
    评论(评论id、照片id、用户id、评论文本、评论时间)
    如果其他用户可以对给定的照片发表评论,那么上面的一张应该是好的。只要所有者能对此发表评论就好了。然后,您甚至不需要在评论中使用用户idtable@Rajesh,任何用户都可以对任何照片发表评论。同样关于您建议的标签表,标签是一个单词,例如,自然或森林等。在这种情况下,
    tag_desc
    tag_attribute1
    仍然需要吗?再次感谢。可能不是,我只是想告诉你,如果你使用关联表,你应该使用tag_id(它是生成的键)而不是tag name。列越多,如果表没有规范化,维护它们就越困难。我的例子有点做作:)谢谢,你的想法很好,一个标签可以被多个用户多次使用。因此,我将有
    标签(标签id,标签name)
    照片标签asc(照片id,标签id)
    。这个好看吗?
    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)