我是否会超越MySql表?

时间:2011-03-24 04:51:13

标签: mysql database-design relationships

开发时我正在添加每个主要添加的数据库。 我最新的是一个图片库计划,我问自己所有这些问题/

可能表格的简化版本

Image (id, name, path, state)
Gallery (id, name, path, state)
Image Gallery Relationship (image id, gallery id)
Image User Relationship (image id, user id)
Image Venue Relationship (image id, venue id)
Image Event Relationship (image id, event id)
Gallery User Relationship (image id, user id)
Gallery Venue Relationship (image id, venue id)
Gallery Event Relationship (image id, event id) 

我认为相同的照片可以由用户拥有/拍摄,分配到活动和场地,在用户照片的图库中,在与活动相关的图库中,在与场地。

现在,如果我想使用相同的数据库来存储用户的个人资料图片,我会为此创建另一个表吗?我应该将个人资料图片ID放入用户表吗?我应该将照片所有权放入Image表吗?但很可能用户不会上传图片的主要部分。一个活动或场地的“个人资料图片”怎么样?还是画廊的封面图片?我创造了很多桌子还是不够?

sidenote 通常在创建列时,我认为如果它是必需的单值属性,则将其放在表中,如果它可以为null或与多个事物相关联,则它应该在另一个表中。但我现在已经60桌了,而且我的计划还不到一半。

这一天我真的缺乏导师,所以非常感谢所有的建议

Pic相关,这是我当前的数据库 my current database

如果我的问题可以更加通用,以帮助有类似问题的未来人,我不介意编辑

2 个答案:

答案 0 :(得分:2)

无论你决定什么,你都应该将它框起来并挂在画廊中。

您可能希望简化它。以不同的方式看待它:考虑一个与图像可能相关联的中心事物表,然后找到这些事物的共同点。添加type字段(galleryvenueevent)。也许你会添加一两个额外的字段,但最终它将大大简化你的工作和数据库。我正在经历同样的灵魂,寻找我正在创造的东西。

答案 1 :(得分:1)

这完全取决于所有对象之间的完全关系。你的描述有点模糊,所以我将在这里做一些假设,但这是我从中得到的:

主要规则:当您拥有多对多关系时,仅使用连接表(如Gallery_Image_Relationship(gallery_id,image_id));我怀疑画廊形象就是一个很好的例子。图库包含许多图像,图像可以属于许多图库。但是,对于其他任何事情,它们只是不必要的并发症。

对于其他人的关系,只需在其中一个表中放入一个外键即可。如果它是一对多,表格显而易见:用户可以上传许多图像,但图像只能由一个用户上传?然后你的图像表得到一个uploader_id列。

那就是说,这就是你的数据库中的内容:

users:
  id,
  name,
  profile_image_id, #A user can only have one profile pic (at a time)
  etc.

images:
  id,
  name,
  uploader_id, #It can only be uploded by one person
  etc.

galleries:
  id,
  name,
  cover_image_id,
  etc.

images_galleries: # 'cause images:galleries is many:many
  image_id,
  gallery_id

(我不知道SO认为是什么语言。它突出显示userbyis和撇号......)

当您尝试将图像与场地和/或事件联系起来时,它会变得更加主观。您是否期望大多数/所有图像都属于特定事件?如果是这样,那么您可能需要在图像表中使用event_id列。场地也一样。

但是,如果您期望许多图像不是任何特定事件,那么这些列只会浪费数据库空间。那么 gallery 通常会绑定到单个活动/场地吗?如果是这样,那就是你的外键所在的位置。

如果这两者都不合适,那么你的联接表仍然是一个选项。我怀疑正常化的顽固分子会赞成,但有时候你不需要挑剔。

希望有所帮助!