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